Десериализация гетерогенного массива JSON в C# с использованием Json.NET
Я искал дни, часы, пытаясь найти ответ на свой вопрос. У меня есть следующая строка JSON:
{
"id": "658@787.000a35000122",
"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 Framework, но застряла в части "status". Вот что побудило меня попробовать 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# еще не совсем на этом уровне. Я пытался расшифровать решения, предлагаемые в ответ на аналогичные вопросы, но пришел к выводу, что я должен что-то упустить.
Моя искренняя благодарность сообществу за то, что нашли время прочитать мой длинный вопрос. Ваша щедрость продолжает удивлять меня!
1 ответ
Если вы используете Json.NET(а если нет, то можете установить его с помощью диспетчера пакетов NuGet)
PM> Install-Package Newtonsoft.Json
Это должно затем направить вас в правильном направлении:)
void Main()
{
string json = @"{
""id"": ""658@787.000a35000122"",
""take"": [{
""level"": [0],
""status"": [[3, [0]]]
}]
}";
RootObject root = JsonConvert.DeserializeObject<RootObject>(json);
}
public class Take
{
[JsonProperty("level")]
public int[] Level { get; set; }
[JsonProperty("status")]
public object[][] Status { get; set; }
}
public class RootObject
{
[JsonProperty("id")]
public string Id { get; set; }
[JsonProperty("take")]
public Take[] Take { get; set; }
}