2017-06-30 9 views
0

イメージ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; 
+1

シリアル化/逆シリアル化コードも同様に投稿してください。あなたの問題を理解するのに役立つかもしれません。 –

答えて

0

あなたのシリアライズ/デシリアライズコードを見ずに、私は問題があると思います。

もう1つの解決方法は、Imageの1つしか持たない場合は、空の画像リスト(Images)を送信することです。したがって、JSONには常にImageImagesがあります。

0

同様の質問が過去に尋ねられました: "How to handle both a single item and an array for the same property using JSON.net"アプローチは、基本的に次のようにcustomConverterを使用することです:

​​
+0

ありがとう@hsoesanto - まったく同じ問題です。私が捜したときに私はそれを見つけられなかった。 –

+0

画像の定義は次のようにしてください。 public class Images { [JsonProperty( "id")] public string Id {get;セット; } [JsonProperty( "image")] [JsonConverter(typeOf(SingleOrArrayConverter ))] 公開リストイメージ{get;セット; } } –

+0

@PaulM申し訳ありませんが、あなたは正しいです。以前編集したときにそれを忘れました。今は修正されています。喜んで助ける=) – hsoesanto

関連する問題