0

次のような Facebook Graph API からの JSON 応答があります。

    {
  "name": "XXXXXX YYYYYYY", 
  "username": "XXXXXX.YYYYYYY", 
  "email": "XXXXXXYYYYYYY@gmail.com", 
  "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; }
            } 
...

最初に「work」フィールドを文字列として追加しようとしました(エラーが始まったときです)、次に辞書として追加しました。これまでのところ、私には運がなく、アイデアが不足しています。助言がありますか?

編集:

それ以来、私は少し前進しました。クラス内にクラスを作成して、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; }
        }


    }

これにより、「作業」要素を除くすべてのフィールドが適切に入力されます (逆シリアル化エラーはなくなります)。「work」には、「employer」フィールドと「position」フィールドが両方とも null であるオブジェクトが入ります。「work」には「picture」と同じレベルのネストされたデータがあり、「picture」は問題なく機能します。どちらも同じように扱っていました。しかし、一方は機能し、もう一方は機能しません。私が見つけた唯一の違いは、元の JSON にあります。

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

「仕事」にはこれらの余分な括弧があります。これに対処する方法はありますか?

4

1 に答える 1