C#中使用Newtonsoft Json反序列化含嵌套数组JSON的正确映射类结构
正确的C#类结构用于反序列化嵌套坐标JSON
首先看你给出的JSON结构:
"coordinates" : [ [ [ 482035.87650000025, 3768510.0446000006, 0 ], [ 482035.86720000021, 3768514.4123, 0 ], [ 482035.68240000028, 3768514.4119000006, 0 ] ] ]
这里的coordinates是一个三层嵌套的数组:最外层是一个数组,里面包含一个数组,这个数组又包含多个由3个数值组成的子数组(代表x、y、z坐标)。
针对这个结构,你可以用两种方式定义映射类:
方式一:直接使用嵌套数组类型
这种方式最直接,完全匹配JSON的嵌套数组结构:
public class RootObject { [JsonProperty("coordinates")] public List<List<List<double>>> Coordinates { get; set; } // 也可以用数组类型替代List:public double[][][] Coordinates { get; set; } }
反序列化的代码示例:
string json = "{\"coordinates\" : [ [ [ 482035.87650000025, 3768510.0446000006, 0 ], [ 482035.86720000021, 3768514.4123, 0 ], [ 482035.68240000028, 3768514.4119000006, 0 ] ] ]}"; RootObject result = JsonConvert.DeserializeObject<RootObject>(json);
方式二:封装内层坐标为实体类(更具可读性)
如果你希望代码更具语义化,方便后续业务逻辑操作坐标,可以把每个三维坐标封装成一个Point类。需要注意属性顺序要和JSON数组的数值顺序对应,或者用特性指定映射关系:
public class Point { // Newtonsoft.Json 13.0+支持用JsonPropertyIndex指定数组位置,避免顺序问题 [JsonPropertyIndex(0)] public double X { get; set; } [JsonPropertyIndex(1)] public double Y { get; set; } [JsonPropertyIndex(2)] public double Z { get; set; } } public class RootObject { [JsonProperty("coordinates")] public List<List<Point>> Coordinates { get; set; } }
这样反序列化时,JSON里的每个三维数值数组都会被自动转换成Point对象,后续使用坐标时会更直观。
两种方式都能正常工作:如果只是快速解析数据,方式一更简单;如果需要长期维护或业务逻辑依赖坐标操作,方式二更合适。
内容的提问来源于stack exchange,提问作者Sithira Pathirana
相关产品推荐
相关产品推荐

