イメージURLを含むイベントデータを逆シリアル化しようとしています。オブジェクトの単一または配列を含むJSONの逆シリアル化
イベントは、単一の画像を含む場合、JSON文字列の形式がある:
"images": {
"image": {
"small": {...},
"width": "48",
"creator": null,
"thumb": {...},
"height": "48",
"url": "http://example.com/image1.jpeg",
"medium": {...},
"id": "1"
}
}
複数の画像が利用可能である場合、応答変化の形式に:
"images": {
"image": [
{
"small": {...},
"width": "48",
"creator": null,
"thumb": {...},
"height": "48",
"url": "http://example.com/image1.jpeg",
"medium": {...},
"id": "1"
},
{
"small": {...},
"width": "48",
"creator": null,
"thumb": {...},
"height": "48",
"url": "http://example.com/image2.jpeg",
"medium": {...},
"id": "2"
}
]
}
いつ脱直列化しようとすると、私はどちらかといえば同時に働くことはできません。
私のモデルのようなものです:次のように私は私のイメージのクラスを定義する場合、それは配列で動作し、
public class Event
{
public string id { get; set; }
public string imageId { get; set; }
public Image image { get; set; }
public Images images { get; set; }
}
public class Image
{
public string id { get; set; }
public string width { get; set; }
public string caption { get; set; }
public string url { get; set; }
public string height { get; set; }
public int smallId { get; set; }
public Small small { get; set; }
public int mediumId { get; set; }
public Medium medium { get; set; }
public int thumbId { get; set; }
public Thumb thumb { get; set; }
}
:
public class Images
{
public string id { get; set; }
public List<Image> image { get; set; }
}
次のように私はそれを定義した場合、それは単一の画像で動作します:
public class Images
{
public string id { get; set; }
public Image image { get; set; }
}
理論的には、ImagesクラスにListとImageの両方を含むことができますが、使用できませんいずれかの名前を変更すると、両方の同じ名前と逆シリアル化が機能しません。
私は両方の応答が有効なJSON(彼らが想定しているものを表す)であることを理解していますが、これは悪い実装ですか?
私はモデル/デシリアライゼーションで、オブジェクトと配列の両方をデシリアライズできる何かを見逃していますか?
ありがとうございました。
UPDATE デシリアライズコード:
var feedUrl = url;
var client = new HttpClient();
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
var serializer = new DataContractJsonSerializer(typeof(EventDetail));
var streamTask = client.GetStreamAsync(feedUrl);
EventDetail eventDetail = serializer.ReadObject(await streamTask) as EventDetail;
return eventDetail;
シリアル化/逆シリアル化コードも同様に投稿してください。あなたの問題を理解するのに役立つかもしれません。 –