Удаление десериализации массива JSON в строго типизированный объект .NET
Когда я могу вызвать стороннюю api и вернуть данные из одного класса, все десериализуется с использованием этого кода
TheUser me = jsonSerializer.Deserialize(response, typeof(TheUser)) as TheUser
Проблема возникает, когда я пытаюсь и десериализую содержимое ответа JSON, которое является массивом, например
{
"data": [
{
"name": "A Jones",
"id": "500015763"
},
{
"name": "B Smith",
"id": "504986213"
},
{
"name": "C Brown",
"id": "509034361"
}
]
}
Я могу заставить сериализацию работать только в том случае, если я использую собственный класс упаковки вокруг члена "data", и этот член должен иметь тип List<object>
. Если он имеет тип List<TheUser>
, я получаю ArgumentException
из метода JsonParser DesializeType
.
Я изначально попытался сериализоваться без типа обертки, подобного этому
List<TheUser> freinds = jsonSerializer.Deserialize(response, typeof(List<TheUser>)) as List<TheUser>;
но это просто возвращает мне пустую коллекцию. Разумеется, я должен иметь десериализацию массива в строго типизированный список.
Ответы
Ответ 1
Afer ищет источник, для WP7 Hammock фактически не использует Json.Net для разбора JSON. Вместо этого он использует собственный парсер, который не очень хорошо справляется с пользовательскими типами.
При использовании Json.Net непосредственно можно десериализовать строго типизированную коллекцию внутри объекта-оболочки.
var response = @"
{
""data"": [
{
""name"": ""A Jones"",
""id"": ""500015763""
},
{
""name"": ""B Smith"",
""id"": ""504986213""
},
{
""name"": ""C Brown"",
""id"": ""509034361""
}
]
}
";
var des = (MyClass)Newtonsoft.Json.JsonConvert.DeserializeObject(response, typeof(MyClass));
return des.data.Count.ToString();
и с:
public class MyClass
{
public List<User> data { get; set; }
}
public class User
{
public string name { get; set; }
public string id { get; set; }
}
Необходимость создания дополнительного объекта с использованием свойства data раздражает, но это следствие того, как построен форматированный объект JSON.
Документация: Сериализация и десериализация JSON
Ответ 2
попробовать
List<TheUser> friends = jsonSerializer.Deserialize<List<TheUser>>(response);
Ответ 3
Это решение, похоже, работает на меня и оборачивается тем, что нужно закодировать кучу классов с "данными" в них.
public interface IDataResponse<T> where T : class
{
List<T> Data { get; set; }
}
public class DataResponse<T> : IDataResponse<T> where T : class
{
[JsonProperty("data")]
public List<T> Data { get; set; }
}
Я должен был включить это для начала, вот пример метода с использованием вышеперечисленного:
public List<TheUser> GetUser()
{
var results = GetUserJson();
var userList = JsonConvert.DeserializeObject<DataResponse<TheUser>>(results.ToString());
return userList.Data.ToList();
}
Ответ 4
Это работало для меня для десериализации JSON в массив объектов:
List<TheUser> friends = JsonConvert.DeserializeObject<List<TheUser>>(response);
Ответ 5
Json.NET - Документация
http://james.newtonking.com/json/help/index.html?topic=html/SelectToken.htm
Интерпретация для автора
var o = JObject.Parse(response);
var a = o.SelectToken("data").Select(jt => jt.ToObject<TheUser>()).ToList();
Ответ 6
Пат, структура json очень хорошо знакома с проблемой, о которой я описал here. Ответ для меня заключался в том, чтобы рассматривать представление json как словарь < TKey, TValue > , хотя было всего 1 вход.
Если я прав, ваш ключ имеет строку типа и значение List <T> где T представляет класс "TheUser"
НТН
PS - если вы хотите, чтобы лучше провести сериализацию с помощью Silverlight Serializer, вам нужно будет создать версию WP7, Я написал сообщение в блоге о this
Ответ 7
Я подозреваю, что проблема заключается в том, что json представляет объект со списком пользователей как свойство. Попробуйте десериализовать что-то вроде:
public class UsersResponse
{
public List<User> Data { get; set; }
}