2013-11-13 3 views
1

Im пытается десериализации JSON, который выглядит так:Json схемы десериализации в C#

{"METHOD":"GET_IVR_ACTION", 
"DATA": {"DID":"972732248673", 
      "CALLER_ID":"972508822570", 
      "CALLER_NAME":null, 
      "IVR_UNIQUE_ID":"4c80c29146c61f3c24ed434e11cb340b", 
      "DTMF":"", 
      "MENU":"-1", 
      "PREVIOUS_MENU":"-1"} 
} 

в этот класс объекта:

public class DATA 
{ 
    public string DID = string.Empty; 
    public string CALLER_ID = string.Empty; 
    public string CALLER_NAME = string.Empty; 
    public string IVR_UNIQUE_ID = string.Empty; 
    public string DTMF = string.Empty; 
    public string MENU = string.Empty; 
    public string PREVIOUS_MENU = string.Empty; 
} 

неудачно По JavaScriptSerializer:

JavaScriptSerializer jsonSerializer = new JavaScriptSerializer(); 
DATA data = jsonSerializer.Deserialize<DATA>(jsonString); 

объект остается пустым ..

+0

попробуйте. Public string DID {get; задавать; } .. на всех ваших свойствах – foxtrotZulu

ответ

1

Ну, строка JSON имеет вложенный объект. JavaScriptSerializer или, по существу, любой другой инструмент сериализации JSON использует отражение для отображения свойств и атрибутов по одному.

Вы должны сначала извлечь строку Data, а затем использовать ее как параметр метода Deserialize.

Попробуйте проверить с:

 { 
      "DID":"972732248673", 
      "CALLER_ID":"972508822570", 
      "CALLER_NAME":null, 
      "IVR_UNIQUE_ID":"4c80c29146c61f3c24ed434e11cb340b", 
      "DTMF":"", 
      "MENU":"-1", 
      "PREVIOUS_MENU":"-1" 
     } 

Чтобы получить Data часть, у вас есть два варианта:

  1. Использование JavaScriptDeserializer, но присвоить результат динамического объекта (не сильно типизированных) , В этом случае, десериализатор использует свои арбитры типа, чтобы найти вложенные типы и даст вам полный граф объектов (объект иерархии)

  2. Используйте регулярные выражения, чтобы получить Data объект JSON из

+0

Ну да, я знаю, что проблема вложенного объекта ... Я попробовал это с помощью простого JSON, как тот, который вы написали выше .. как извлечь только строку DATA? СПАСИБО !! – Natali

+1

Другой альтернативой является размещение вашего класса DATA в другом классе. – RealityDysfunction

+0

Хорошо, мне удалось десериализовать его на динамический объект следующим образом: var dict = jsonSerializer.Deserialize (jsonString); И теперь я пытаюсь извлечь CALLER_ID из объекта. когда я пробую вот так: dict ["DATA"] ["CALLER_ID"] --- Я получаю результат как динамический тип {string} .. как его преобразовать в простую строку? – Natali

0

Это мой метод десериализации JSON:

public static bool CreateJson(ref Dictionary<string, object> values, string source) 
    { 
     bool result = false; 
     if (!string.IsNullOrEmpty(source)) 
     { 
      var serializer = new JavaScriptSerializer(); 
      object json = serializer.DeserializeObject(source); 
      values = json as Dictionary<string, object>; 
      result = values != null; 
     } 

     return result; 
    } 

Обратите внимание, что он создает словарь и возвращает его. Затем вы можете (в отладчике) просмотреть этот результат и посмотреть на значения в нем. Затем вы можете найти правильный способ вытащить нужные значения. Работает для меня каждый раз.

HTH!

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