如何用C#的Newtonsoft.Json将JSON中点的x/y转为数组?
将ESRI Shapefile导出JSON中的点要素Geometry从{x,y}对象转为[x,y]数组
针对ESRI Shapefile导出的JSON中点要素geometry以{x: 值, y: 值}对象形式存储的情况,用Newtonsoft.Json可以通过两种方式实现转换为[x,y]数组的需求:
方式一:自定义JsonConverter(强类型反序列化)
这种方式适合需要将JSON映射到实体类的场景,通过自定义转换器处理geometry字段的转换逻辑:
1. 定义实体类与转换器
using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Collections.Generic; // 顶层要素集合类 public class FeatureCollection { public List<Feature> Features { get; set; } } // 单个要素类 public class Feature { // 指定用自定义转换器处理Geometry属性 [JsonConverter(typeof(PointGeometryConverter))] public double[] Geometry { get; set; } public Attributes Attributes { get; set; } } // 要素属性类(根据你的JSON结构调整字段) public class Attributes { public string Name { get; set; } // 其他属性字段... } // 自定义转换器:把{x,y}对象转为[x,y]数组 public class PointGeometryConverter : JsonConverter { public override bool CanConvert(Type objectType) { return objectType == typeof(double[]); } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { var geometryObj = JObject.Load(reader); double x = geometryObj.Value<double>("x"); double y = geometryObj.Value<double>("y"); return new double[] { x, y }; } // 如果需要将数组反向转回{x,y}对象,可实现WriteJson方法 public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var coords = value as double[]; if (coords != null && coords.Length == 2) { writer.WriteStartObject(); writer.WritePropertyName("x"); writer.WriteValue(coords[0]); writer.WritePropertyName("y"); writer.WriteValue(coords[1]); writer.WriteEndObject(); } } }
2. 使用示例
// 读取JSON文件 string rawJson = File.ReadAllText("your-shapefile.json"); // 反序列化为实体类,此时Geometry已转为数组 var featureCollection = JsonConvert.DeserializeObject<FeatureCollection>(rawJson);
方式二:直接操作JObject(无实体类场景)
如果不需要映射到实体类,可直接解析JSON对象并修改geometry字段:
using Newtonsoft.Json.Linq; string rawJson = File.ReadAllText("your-shapefile.json"); var rootObj = JObject.Parse(rawJson); // 遍历所有要素 foreach (var feature in rootObj["features"].Children<JObject>()) { var geometryObj = feature["geometry"]; double x = geometryObj["x"].Value<double>(); double y = geometryObj["y"].Value<double>(); // 将原{x,y}对象替换为[x,y]数组 feature["geometry"] = new JArray(x, y); } // 输出转换后的JSON string convertedJson = rootObj.ToString(Formatting.Indented); // 也可以写入文件 File.WriteAllText("converted-shapefile.json", convertedJson);
关键说明
- 方式一适合长期维护的项目,强类型更易读也更安全;
- 方式二适合快速处理单文件的场景,无需定义大量实体类;
- 确保你的Newtonsoft.Json版本是最新的,避免兼容性问题。
内容的提问来源于stack exchange,提问作者kleinibird
相关产品推荐
相关产品推荐

