JSON转换为C#,反序列化对象或数组的属性

您所在的位置:网站首页 result标签包含的属性有 JSON转换为C#,反序列化对象或数组的属性

JSON转换为C#,反序列化对象或数组的属性

2023-05-29 03:08| 来源: 网络整理| 查看: 265

我在处理应用程序中使用的api中的JSON数据时遇到了问题。问题是JSON包含一些属性,当有一个项目时这些属性是一个对象,当有更多项目时这些属性变成一个数组。所以这是一个像这样的结构:

[ { "MyObj": { "Foo": "Bar" } }, { "MyObj": [ { "Foo": "Bar1" }, { "Foo": "Bar2" } ] } ]

我已经尝试了几个JSON到C#的转换器,其中一些会生成object类型的属性,quicktype.io转换器会生成以下内容:

public class Example { [JsonProperty("MyObj")] public MyObjUnion MyObj { get; set; } } public partial class MyObjElement { [JsonProperty("Foo")] public string Foo { get; set; } } public struct MyObjUnion { public MyObjElement MyObjElement; public MyObjElement[] MyObjElementArray; public static implicit operator MyObjUnion(MyObjElement MyObjElement) => new MyObjUnion { MyObjElement = MyObjElement }; public static implicit operator MyObjUnion(MyObjElement[] MyObjElementArray) => new MyObjUnion { MyObjElementArray = MyObjElementArray }; } internal class MyObjUnionConverter : JsonConverter { public override bool CanConvert(Type t) => t == typeof(MyObjUnion) || t == typeof(MyObjUnion?); public override object ReadJson(JsonReader reader, Type t, object existingValue, JsonSerializer serializer) { switch (reader.TokenType) { case JsonToken.StartObject: var objectValue = serializer.Deserialize(reader); return new MyObjUnion { MyObjElement = objectValue }; case JsonToken.StartArray: var arrayValue = serializer.Deserialize(reader); return new MyObjUnion { MyObjElementArray = arrayValue }; } throw new Exception("Cannot unmarshal type MyObjUnion"); } public override void WriteJson(JsonWriter writer, object untypedValue, JsonSerializer serializer) { var value = (MyObjUnion)untypedValue; if (value.MyObjElementArray != null) { serializer.Serialize(writer, value.MyObjElementArray); return; } if (value.MyObjElement != null) { serializer.Serialize(writer, value.MyObjElement); return; } throw new Exception("Cannot marshal type MyObjUnion"); } public static readonly MyObjUnionConverter Singleton = new MyObjUnionConverter(); }

虽然这确实可以正常工作,但仍然有点麻烦,因为要获取数据,您总是需要检查它是在MyObjElement类中还是在MyObjElementArray类中。所以问题是,是否有其他更优雅的方法来解决这个问题。(除了更改API输出之外,这不是我的)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3