Member 14836690 Ответов: 1

Ошибка десериализации JSON в объект icollection<T>


Ошибка, которую я получаю, заключается в следующем:

текущий массив JSON (например, [1,2,3]) преобразуется в тип 'Dorman.Спецордерску.Модели.Вопросы", потому что для правильной десериализации типа требуется объект JSON (например, {"name":" value"}).

Что я уже пробовал:

формат JSON:
{
    "PartNumber": "123-456",
    "NumberOfQuestions": 5,
    "dateLastModified": "",
    "status": "active",
    "type": "question",
    "Questions": [
        {
            "validationID": 1,
            "QuestionID": 1,
            "Question": "some question text",
            "ResponseType": "Single_Select",
            "Option_List": {
                "1": "option 1 text",
                "2": "option 2 text",
                "3": "option 3 text"
            }
        },
        {
            "validationID": 1,
            "QuestionID": 2,
            "Question": "some question text",
            "ResponseType": "Multi_Select",
            "Option_List": [
                "option 4 text",
                "option 5 text",
                "option 6 text"
            ]
        },
        {
            "validationID": 6,
            "QuestionID": 3,
            "Question": "some question text",
            "ResponseType": "Number"
        },
        {
            "validationID": 2,
            "QuestionID": 4,
            "Question": "some question text",
            "ResponseType": "String"
        },
        {
            "validationID": 3,
            "QuestionID": 5,
            "Question": "some question text",
            "ResponseType": "Boolean"
        }
    ],
    "id": "ab3fcc42-9d5a-48d4-96ea-388c5edd886f",
    "_rid": "HopBAKbRQQ0BAAAAAAAAAA==",
    "_self": "dbs/HopBAA==/colls/HopBAKbRQQ0=/docs/HopBAKbRQQ0BAAAAAAAAAA==/",
    "_etag": "\"2e00b41c-0000-0200-0000-5ed857d40000\"",
    "_attachments": "attachments/",
    "_ts": 1591236564
}


Я использовал приведенный ниже класс для десериализации

public class QuestionsAnswers
{
    [JsonProperty("PartNumber")]
    public string PartNumber { get; set; }

    [JsonProperty("NumberOfQuestions")]
    public int NumberOfQuestions { get; set; }

    [JsonProperty("dateLastModified")]
    public string DateLastModified { get; set; }

    [JsonProperty("status")]
    public string Status { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    public QuestionList Questions { get; set; }

    [JsonProperty("id")]
    public string ID { get; set; }

    [JsonProperty("_rid")]
    public string Rid { get; set; }

    [JsonProperty("_self")]
    public string Self { get; set; }

    [JsonProperty("_etag")]
    public string Etag { get; set; }

    [JsonProperty("_attachments")]
    public string Attachments { get; set; }

    [JsonProperty("_ts")]
    public int Ts { get; set; }
}

public class QuestionList : ICollection<Questions>
{
    public List<Questions> questionList { get; set; }

    public int Count
    {
        get { return questionList.Count; }
    }

    public bool IsReadOnly
    {
        get
        {
            return false;
        }
    }

    public void Add(Questions item)
    {
        questionList.Add(item);
    }

    public void Clear()
    {
        questionList.Clear();
    }

    public bool Contains(Questions item)
    {
        return questionList.Contains(item);
    }

    public void CopyTo(Questions[] array, int arrayIndex)
    {
        questionList.CopyTo(array, arrayIndex);
    }

    public IEnumerator<Questions> GetEnumerator()
    {
        return questionList.GetEnumerator();
    }

    public bool Remove(Questions item)
    {
        return questionList.Remove(item);
    }

    IEnumerator<Questions> IEnumerable<Questions>.GetEnumerator()
    {
        foreach (Questions ApptReason in questionList)
        {
            yield return ApptReason;
        }
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return this.GetEnumerator();
    }

}

public class Questions
{
   // [JsonProperty("validationID")]
    public int ValidationID { get; set; }

  //  [JsonProperty("QuestionID")]
    public int QuestionID { get; set; }

   // [JsonProperty("Question")]
    public string Question { get; set; }

 //   [JsonProperty("ResponseType")]
    public string ResponseType { get; set; }

    //[JsonProperty("Option_List")]
    //public Dictionary<string, string> OptionList { get; set; }
}


Может ли кто-нибудь помочь мне в этом

1 Ответов

Рейтинг:
8

F-ES Sitecore

Ваш код работал нормально для меня, за исключением того, что мне пришлось добавить конструктор в класс QuestionList

public QuestionList()
{
    this.questionList = new List<Questions>();
}


Но не потому, что я получал ту же ошибку, что и вы, так что если вы все еще получаете эту ошибку, проблема может лежать в другом месте.

Для справки это был мой код вызова;

var qa = JsonConvert.DeserializeObject<QuestionsAnswers>(json);


Member 14836690

Спасибо за информацию. но, к сожалению, после обновления конструктора это не сработало. Вот сообщение об ошибке, которое я получил "Newtonsoft.Json.JsonSerializationException: 'не удается десериализовать текущий массив JSON (например, [1,2,3]) В тип 'Dorman.Спецордерску.Модели.Вопросы", потому что для правильной десериализации типа требуется объект JSON (например, {"name":" value"}).
Чтобы исправить эту ошибку, либо измените JSON на объект JSON (например, {"name":"value"}), либо измените десериализованный тип на массив или тип, реализующий интерфейс коллекции (например, ICollection, IList), например List<t>, который может быть десериализован из массива JSON. JsonArrayAttribute также может быть добавлен к типу, чтобы заставить его десериализоваться из массива JSON.'
"

F-ES Sitecore

Тогда ваш json не такой, как вы написали, это будет массив, поэтому он будет начинаться и заканчиваться в квадратных скобках;

[{...}, {...}]

в этом случае вам нужно десериализоваться в список

var qa = JsonConvert.DeserializeObject<List<QuestionsAnswers>>(json);

F-ES Sitecore

Вы определяете option_list двумя разными способами в одном и том же json, вам придется выбрать один формат и придерживаться его. Если вы используете

"список опций": [
"Вариант 1 текст",
"вариант 2 Текст",
"вариант 3 текст"
]

затем определите option_list как

[JsonProperty("Option_List")]
публичный список<string> OptionList { get; set; }

Если вы используете

"список опций": {
"1": "текст варианта 4",
"2": "Вариант 5 текст",
"3": "текст варианта 6"
}

затем

[JsonProperty("Option_List")]
публичных словарь&ЛТ;строку, строку&ГТ; OptionList { получить; набор; }

Member 14836690

Спасибо за обновление F-ES Sitecore. Ты спасла мне жизнь.