Удаление десериализации простого массива JSON с помощью DataContractJsonSerializer
Я уверен, что этот вопрос задавался снова и снова, но по какой-то причине мне все еще не удается заставить это работать.
Я хочу десериализовать объект JSON, содержащий один элемент; массив строк:
{"results" : ["a", "b"]}
Это класс, который я пытаюсь десериализовать:
public class Whatever {
[DataMember(Name = "results")]
public string[] Results { get; protected set; }
}
И это метод Deserialize:
private static T Deserialize<T>(string json)
{
var instance = Activator.CreateInstance<T>();
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serializer = new DataContractJsonSerializer(instance.GetType());
return (T)serializer.ReadObject(ms);
}
}
Вызов типа Deserialize<Whatever>("{\"results\" : [\"a\", \"b\"]}")
возвращает инициализированный экземпляр Whatever
, но массив Results
остается null
.
Что-то не так со структурой Whatever
?
Ответы
Ответ 1
А, после публикации этого, я понял, что мне не хватает атрибута DataContract
атрибута на Whatever
:
[DataContract]
public class Whatever {
[DataMember(Name = "results")]
public string[] Results { get; protected set; }
}
Теперь он отлично работает.
Ответ 2
Я знаю, сообщение совершенно запрещено; но:
также можно напрямую вернуть список объектов класса, если вы получили jsonarray-строку информации для привязки к dataclass; то есть:.
List<SomeDataClass> filesToMove = new List<SomeDataClass>();
public T deserializeJSON<T>(string json)
{
var instance = typeof(T);
var lst = new List<SomeDataClass>();
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var deserializer = new DataContractJsonSerializer(instance);
return (T)deserializer.ReadObject(ms);
}
}
someJsonArrayString = "[{\"ID\":7},{\"ID\":16}]";
filesToMove = deserializeJSON<List<SomeDataClass>>(someJsonArrayString);
Console.WriteLine(filesToMove[1].ID); // returns 16
с dataclass SomeDataClass.cs:
[DataContract]
class SomeDataClass
{
[DataMember]
public int ID { get; set; }
}