C# JSON序列化时geometry类coordinates多维度数组声明问题
问题解决方法
你遇到的报错核心原因是GeoJSON格式中,不同类型的几何要素对应的coordinates字段结构不固定:
Point类型对应一维浮点数组LineString类型对应二维浮点数组- 后续如果涉及
Polygon等类型还会出现三维数组
固定声明为float[]或float[,]无法兼容多种结构,所以会序列化失败。
方案1:动态类型适配(快速实现)
如果你用Newtonsoft.Json(Json.NET)做序列化,直接修改geometry类如下即可:
public class geometry { public string type { get; set; } // 用JToken可以兼容任意结构的JSON数组 public Newtonsoft.Json.Linq.JToken coordinates { get; set; } }
使用时根据type字段读取对应坐标即可:
// 读取Point坐标 if (geometry.type == "Point") { float lng = geometry.coordinates[0].Value<float>(); float lat = geometry.coordinates[1].Value<float>(); } // 读取LineString坐标 else if (geometry.type == "LineString") { foreach (var point in geometry.coordinates) { float lng = point[0].Value<float>(); float lat = point[1].Value<float>(); } }
如果你用的是.NET自带的System.Text.Json,将字段类型换成JsonElement即可,用法逻辑一致。
方案2:自定义转换器实现强类型(推荐生产环境用)
如果需要强类型约束避免运行时错误,可以自定义JsonConverter统一把坐标转成锯齿数组float[][]:
(以Newtonsoft.Json为例)
首先修改geometry类:
public class geometry { public string type { get; set; } [Newtonsoft.Json.JsonConverter(typeof(CoordinatesConverter))] public float[][] coordinates { get; set; } }
然后实现转换器类:
public class CoordinatesConverter : JsonConverter<float[][]> { public override float[][] ReadJson(JsonReader reader, Type objectType, float[][] existingValue, bool hasExistingValue, JsonSerializer serializer) { var token = JToken.Load(reader); // 如果是一维数组(Point类型),包装成二维数组 if (token is JArray arr && arr.First is JValue) { return new float[][] { arr.Select(v => v.Value<float>()).ToArray() }; } // 如果是二维数组直接返回 return token.ToObject<float[][]>(); } public override void WriteJson(JsonWriter writer, float[][] value, JsonSerializer serializer) { // 序列化时如果只有一个元素,直接输出一维数组 if (value.Length == 1) { serializer.Serialize(writer, value[0]); return; } serializer.Serialize(writer, value); } }
使用时直接按强类型读取即可:
- Point类型取
coordinates[0][0]、coordinates[0][1] - LineString类型遍历
coordinates数组取每一组坐标
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

