Я искал дни, часы за раз, пытаясь найти ответ на мой вопрос. У меня есть следующие JSON строку:Deserializing гетерогенный массив JSON в C# с использованием Json.NET
{
"id": "[email protected]",
"take": [{
"level": [0],
"status": [[3, [0]]]
}]
}
То есть образец различных сообщений, которые мне нужны для десериализации, но это тот, который вызывает у меня боль в сердце прямо сейчас. Проблемной частью для меня является массив «status». Мой класс, чтобы принять результаты десериализации строки является:
[DataContract]
public class ReceivedMsg
{
public ReceivedMsg()
{
move = new List<MoveOperation>();
}
[DataMember]
public string id { get; set; }
[DataMember]
public List<MoveOperation> move { get; set; }
[DataContract]
public class Status
{
[DataMember]
public int destination { get; set; }
[DataMember]
public int[] source { get; set; }
}
[DataContract]
public class MoveOperation
{
public MoveOperation()
{
status = new List<Status>();
}
[DataMember]
public int[] level;
[DataMember]
public List<Status> status { get; set; }
}
}
код, чтобы сделать десериализации является:
ReceivedMsg m = new ReceivedMsg();
m = JsonConvert.DeserializeObject<ReceivedMsg>(strResp, new JsonSerializerSettings { TraceWriter = traceWriter });
Где strResp находится строка с указанными данными в формате JSON.
Первоначально я попытался использовать библиотеку JSON, которая является частью платформы .NET, но застряла на части статуса. Вот что побудило меня попробовать Json.NET.
Ошибка я получаю:
An unhandled exception of type 'Newtonsoft.Json.JsonSerializationException' occurred in Newtonsoft.Json.dll
Additional information: Cannot deserialize the current JSON array (e.g. [1,2,3]) into type 'Roper.Roper+ReceivedMsg+Status' because the type requires a JSON object (e.g. {"name":"value"}) to deserialize correctly.
To fix this error either change the JSON to a JSON object (e.g. {"name":"value"}) or change the deserialized type to an array or a type that implements a collection interface (e.g. ICollection, IList) like List<T> that can be deserialized from a JSON array. JsonArrayAttribute can also be added to the type to force it to deserialize from a JSON array.
Path 'move[0].status[0]', line 6, position 16.
Любая помощь будет принята с благодарностью. Конечно, я буду рад предоставить дополнительную информацию по мере необходимости. Я пробовал делать пользовательский конвертер, но я думаю, что мои знания C# еще не совсем на этом уровне. Я пытался расшифровать решения, предлагаемые в ответ на подобные вопросы, но пришел к выводу, что я должен что-то упустить.
Моя искренняя благодарность сообществу за то, что нашли время, чтобы прочитать мой длинный вопрос. Ваша щедрость продолжает удивлять меня!
По вашему коду не похоже, что вы используете JSON.NET. Это чистый .NET и JSON. Это JSON.NET: https://www.nuget.org/packages/Newtonsoft.Json/ – BrunoLM