2014-10-20 3 views
1

Я искал дни, часы за раз, пытаясь найти ответ на мой вопрос. У меня есть следующие 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# еще не совсем на этом уровне. Я пытался расшифровать решения, предлагаемые в ответ на подобные вопросы, но пришел к выводу, что я должен что-то упустить.

Моя искренняя благодарность сообществу за то, что нашли время, чтобы прочитать мой длинный вопрос. Ваша щедрость продолжает удивлять меня!

+0

По вашему коду не похоже, что вы используете JSON.NET. Это чистый .NET и JSON. Это JSON.NET: https://www.nuget.org/packages/Newtonsoft.Json/ – BrunoLM

ответ

0

Если вы используете Json.NET (и если вы не можете установить его с помощью менеджера пакетов NuGet)

PM> Install-Package Newtonsoft.Json

Это должно затем направить вас в правильном направлении :)

void Main() 
{ 
    string json = @"{ 
    ""id"": ""[email protected]"", 
    ""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; } 
} 

File structure

+0

Айдын, пожалуйста, примите мою искреннюю благодарность! Ваш ответ - именно то, что мне нужно. Я все еще нахожусь на стадии обучения C#, и есть много вещей, которые я должен изучить. Я не знаком с использованием объекта, но после небольшого чтения на нем ваше использование этого имеет смысл. Каждый день - хороший день, но когда я чему-то научился, он делает день еще лучше. Еще раз спасибо за вашу помощь и сделать мой хороший день еще лучше! –

Смежные вопросы