You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 20:06:23