Подтвердить что ты не робот

Удаление десериализации простого массива 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?

4b9b3361

Ответ 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; }        
}