反序列化包含单个或一组对象的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中有Image
和Images
。
过去也提出过类似的问题:“ 如何使用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(); } }
- ASP.Net核心MVC6未经授权重定向到登录
- 如何在.Net Core中不使用第三方记录器的情况下登录文件?
- 程序’ dotnet.exe’已退出,代码为-2147450749
- VS.NET 2017强制在ASP.NET 2.0 Core应用程序中使用StackExchange.Redis 1.2.4.0
- 如何将相同的列添加到EF Core中的所有实体?
- .NET Core控制台应用程序,如何为每个环境配置appSettings?
- 如何在.NET Core中修改文件访问控制
- 将global.asax迁移到ASP.NET 5
- Windows 10上的.net核心安装iot(Raspberry PI3 – ARM)