Десериализация массива JSON смешанных типов - PullRequest
2 голосов
/ 11 октября 2010

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

По сути, я получаю строку JSON, подобную приведенной ниже. Я хотел бы получить массив для десериализации в список, где позиция 0 имеет Int32, позиция 1 имеет строку, а позиция 2 имеет экземпляр моего пользовательского класса.

[
   2,
   "Mr. Smith",
   {
      "num":169,
      "name":"main street",
      "state":66
   }
]

Если я просто создаю сериализацию примерно так:

DataContractJsonSerializer ser = new DataContractJsonSerializer(typeof(List<object>))

Я на самом деле получаю Int32 в позиции 0 и строку в позиции 1. Однако в позиции 2 я просто получаю нулевой объект.

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

Ответы [ 2 ]

2 голосов
/ 11 октября 2010

Вы должны создать класс, который воспроизводит структуру json следующим образом:

[DataContract]
public class MyClass {
    [DataMember]
    public int IntMember { get; set; }
    [DataMember]
    public string StringMember { get; set; }
    [DataMember]
    public MyType[] AllTypes { get; set;}
}

[DataContract]
public class MyType {
    [DataMember]
    public int num { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public int state { get; set;}
}

Украсьте класс и его свойства с помощью атрибутов «DataContract» и «DataMember». Затем в своем десериализационном коде используйте класс, который вы создали, как в следующем примере

var serializer = new DataContractJsonSerializer(typeof(MyClass));
System.IO.StringReader reader = new System.IO.StringReader(jsonData);
System.IO.MemoryStream ms = new System.IO.MemoryStream(Encoding.Default.GetBytes(jsonData));
return serializer.ReadObject(ms) as MyClass;
1 голос
/ 02 февраля 2011

Mike,

Проблема в том, что во время десериализации десериализатор JSON не знает, какой тип десериализовать элемент в позиции от 2 до.

Вам необходимо предоставить подсказку "__type",Вы можете получить подсказку __type для этого конкретного типа, фактически сериализовав его в JSON в полиморфной ситуации и посмотрев, какой тип подсказки выдается.

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/bb412170.aspx. Обратите особое вниманиев разделы «Коллекции, присвоенные объекту» и «Сохранение информации о типе»

...