次のような 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 {...}
「仕事」にはこれらの余分な括弧があります。これに対処する方法はありますか?