2015-03-23 1 views
1

Я пытаюсь десериализовать следующий ответ JSON с помощью RestSharp. Я попробовал различные структуры модели, чтобы извлечь данные безрезультатно. Я все время сработал на вложенных массивах.Удаление десериализации вложенных массивов JSON с использованием RestSharp

У меня нет контроля над сервисом, поэтому я не могу изменить формат.

JSON Формат:

[ 
    { 
     "results": 19, 
     "statuscode": 200, 
    }, 
    [ 
     { 
      "id": 24, 
      "name": "bob" 
     }, 
     { 
      "id": 82, 
      "name": "alice" 
     } 
    ] 
] 

Используя эту модель, я был в состоянии вытащить данные из первого объекта, но это все. Я не уверен, как точно прочитать массив, который приходит после объекта.

public class Info 
{ 
    public int results { get; set; } 
    public int statuscode { get; set; } 
} 

Пример deseralization:

var deserializer = new JsonDeserializer(); 
var wat = deserializer.Deserialize<List<List<Info>>>(response); 

Am Я просто полностью отсутствую что-то здесь или являются моими единственными вариантами писать пользовательский десериализатор и/или использовать что-то вроде Json.NET?

ответ

1

Проблема заключается в том, что ваш массив JSON исключительно полиморфен: его первым элементом является объект, а его второй элемент - это массив объектов. Более естественным способом представить это было бы как объект JSON с двумя именованными свойствами, но это не то, что вам было дано. Дессериализация этого непосредственно в C# POCO с двумя именованными свойствами за один шаг с любым сериализатором будет сложной задачей, поскольку модель данных JSON отличается от вашей желаемой модели данных. Вместо этого может быть проще десериализовать промежуточное представление и преобразовать. К счастью, RestSharp имеет соответствующие промежуточные классы JsonObject и JsonArray.

Таким образом, если вы десериализации к следующим классам:

public class Info 
{ 
    public int results { get; set; } 
    public int statuscode { get; set; } 
} 

public class IdAndName 
{ 
    public int id { get; set; } 
    public string name { get; set; } 
} 

public class ResponseContent 
{ 
    public Info Info { get; set; } 
    public List<IdAndName> Data { get; set; } 
} 

Вы можете сделать:

 var array = (JsonArray)SimpleJson.DeserializeObject(response.Content); 
     var responseContent = (array == null ? (ResponseContent)null : new ResponseContent() 
     { 
      Info = array.OfType<JsonObject>().Select(o => SimpleJson.DeserializeObject<Info>(o.ToString())).FirstOrDefault(), 
      Data = array.OfType<JsonArray>().SelectMany(a => SimpleJson.DeserializeObject<List<IdAndName>>(a.ToString())).ToList() 
     }); 

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

  • Нет связанных вопросов^_^