2013-06-14 2 views
0

У меня есть ответ JSON из Facebook Graph API, который выглядит следующим образом:десериализация более сложный JSON с DataContractJsonSerializer

{ 
    "name": "XXXXXX YYYYYYY", 
    "username": "XXXXXX.YYYYYYY", 
    "email": "[email protected]", 
    "location": { 
    "id": "110507998976900", 
    "name": "Someplace, Somestate" 
    }, 
    "work": [ 
    { 
     "employer": { 
     "id": "4647647894784698", 
     "name": "Some Employer" 
     }, 
     "location": { 
     "id": "7489468976968988", 
     "name": "Someplace, Somestate" 
     }, 
     "position": { 
     "id": "4876498697859795", 
     "name": "Boss" 
     }, 
     "start_date": "0000-00" 
    } 
    ], 
    "id": "1895789769789679", 
    "picture": { 
    "data": { 
     "url": "https://fbcdn-aaaaaaa.net/aaaaaaaa/458768_484784776868_4875876876_q.jpg", 
     "is_silhouette": false 
    } 
    } 

Я унаследовал код, который десериализует ответ, но я добавил более сложные поля, как место, работа и изображение в запрос, и теперь десериализатор JSON вызывает ошибку.

У меня есть класс-оболочку, которая использует DataContractJsonSerializer.ReadObject(), и класс контракта данных, выглядит следующим образом:

[DataContract] 
    public class FacebookMe 
    {   
     private string fbId; 
     [DataMember] 
     public string id 
     { 
      get { return fbId; } 
      set { fbId = value; } 
      } 
... 

Я попытался добавить поле «работа» первой в строке, (это когда ошибки начались), затем в качестве словаря. До сих пор мне не везло, и у меня заканчиваются идеи. Любые предложения?

EDIT:

С тех пор я продвинулся немного. Я создал классы внутри классов, чтобы имитировать структуру нотации JSON:

[DataContract] 
     public class Work 
     { 
      [DataContract] 
     public class Employer 
     { 
      private string fbEmployerName; 
      [DataMember] 
      public string name 
      { 
       get { return fbEmployerName; } 
       set { fbEmployerName = value; } 
      } 
     } 

     private Employer fbEmployer; 
     [DataMember] 
     public Employer employer 
     { 
      get { return fbEmployer; } 
      set { fbEmployer = value; } 
     } 

     [DataContract] 
     public class Position 
     { 
      private string fbPositionName; 
      [DataMember] 
      public string name 
      { 
       get { return fbPositionName; } 
       set { fbPositionName = value; } 
      } 
     } 

     private Position fbPosition; 
     [DataMember] 
     public Position position 
     { 
      get { return fbPosition; } 
      set { fbPosition = value; } 
     } 
    } 

    private Work fbWork; 
    [DataMember] 
    public Work work 
    { 
     get { return fbWork; } 
     set { fbWork = value; } 
    } 

[DataContract] 
     public class Picture 
     { 
      [DataContract] 
      public class Data 
      { 
       private string fbPictureUrl; 
       [DataMember] 
       public string url 
       { 
        get { return fbPictureUrl; } 
        set { fbPictureUrl = value; } 
       } 

       private bool fbPictureIsSilhouette; 
       [DataMember] 
       public bool is_silhouette 
       { 
        get { return fbPictureIsSilhouette; } 
        set { fbPictureIsSilhouette = value; } 
       } 

      } 

      private Data fbPictureData; 
      [DataMember] 
      public Data data 
      { 
       get { return fbPictureData; } 
       set { fbPictureData = value; } 
      } 
     } 

     private Picture fbPicture; 
     [DataMember] 
     public Picture picture 
     { 
      get { return fbPicture; } 
      set { fbPicture = value; } 
     } 


    } 

Это приводит к заполнению всех полей правильно (и ошибка десериализации ушла) для элемента «работы» За исключением. «работа» заполняется объектом, у которого есть поля «работодатель» и «позиция», которые являются нулевыми. «работа» имеет тот же уровень вложенных данных, что и «картинка», а «картинка» работает просто отлично. Я обрабатывал их одинаково. Но один работает, а другой - нет. Они только различие, которое я мог заметить в оригинальном формате JSON:

work [ {...} ] 
picture {...} 

«работа» имеет такие дополнительные скобки. Есть идеи, как с этим бороться?

+0

какая ошибка? и показать больше кода в DataContract. – Cybermaxs

+0

некоторая ошибка сериализации. Я уже избавился от этого. Я обновил свой вопрос. – Shaggydog

ответ

0

Таким образом, скобки обозначают массив. в этом случае это массив «рабочих» объектов, а именно один «рабочий» объект. Есть массив, потому что у вас могло бы быть больше работодателей, поэтому больше «работают» с объектами. Решение заключалось в том, чтобы создать класс контрактов данных, чтобы ожидать массив «рабочих» элементов.

private Work[] fbWork; 
     [DataMember] 
     public Work[] work 
     { 
      get { return fbWork; } 
      set { fbWork = value; } 
     } 
Смежные вопросы