反序列化包含单个或一组对象的JSON

我正在尝试反序列化包含图片url的事件数据。

当事件包含单个图像时,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; } } 

如果我按如下方式定义我的Images类,它适用于数组:

 public class Images { public string id { get; set; } public List image { get; set; } } 

如果我按如下方式定义它,它适用于单个图像:

 public class Images { public string id { get; set; } public Image image { get; set; } } 

从理论上讲,我可以在Images类中包含List和Image,但是我不能对两者使用相同的名称,如果我更改任一名称,则反序列化不起作用。

我知道这两个响应都是有效的JSON(它们代表了它们应该是什么),但这是一个糟糕的实现吗?

或者我在模型/反序列化中遗漏了哪些东西应该允许我反序列化单个对象和数组?

谢谢。

更新反序列化代码:

 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; 

在没有看到序列化/反序列化代码的情况下,我认为存在问题。

另一个解决方案可能是,如果您只有一个Image ,则发送一个空的图像列表( Images ),反之亦然。 所以你总是在你的JSON中有ImageImages

过去也提出过类似的问题:“ 如何使用JSON.net处理同一属性的单个项目和数组 ”。 该方法基本上是使用customConverter如下:

 public class Images { [JsonProperty("id")] public string Id { get; set; } [JsonProperty("image")] [JsonConverter(typeof(SingleOrArrayConverter))] public List Image { get; set; } } public class SingleOrArrayConverter : JsonConverter { public override bool CanConvert(Type objectType) { return (objectType == typeof(List)); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { JToken token = JToken.Load(reader); if (token.Type == JTokenType.Array) { return token.ToObject>(); } return new List { token.ToObject() }; } public override bool CanWrite { get { return false; } } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { throw new NotImplementedException(); } }