2017-06-30 25 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

没有看到你的序列化/反序列化的代码,我认为这个问题是存在的。

另一个解决方案可能是您发送空的图像列表(Images),如果您只有一个Image,反之亦然。因此,您的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”)]]组; } } –

+0

@PaulM对不起,你是对的。在之前进行编辑时错过了。现在已经修复了。很高兴帮助=) – hsoesanto

相关问题