如何修改从使用 Json.Net 序列化数据集获得的 JSON 以用于 ESRI 地理编码

Posted

技术标签:

【中文标题】如何修改从使用 Json.Net 序列化数据集获得的 JSON 以用于 ESRI 地理编码【英文标题】:How to modify the JSON obtained from serializing a DataSet using Json.Net for purposes of ESRI geocoding 【发布时间】:2021-09-03 06:52:40 【问题描述】:

如何在下面的JSON文本中引入“属性”级别?我正在使用从 SQL 服务器填充的 C# 数据集和来自 Newtonsoft.json 的 SerializeObject。

这是用于向 ESRI 批量地理编码器提交数据,as described here。

他们的 REST 服务期望的格式如下所示


  "records": [
    
      "attributes": 
        "OBJECTID": 1,
        "Address": "4550 Cobb Parkway North NW",
        "City": "Acworth",
        "Region": "GA"
      
    ,
    
      "attributes": 
        "OBJECTID": 2,
        "Address": "2450 Old Milton Parkway",
        "City": "Alpharetta",
        "Region": "GA"
      
    
  ]

我的 C# 脚本创建的格式如下所示(缺少“属性”级别。)


  "records": [
    
      "OBJECTID": 1,
      "address": "4550 Cobb Parkway North NW",
      "city": "Acworth",
      "state": "GA",
      "zip": 30101.0
    ,
    
      "OBJECTID": 2,
      "address": "2450 Old Milton Parkway",
      "city": "Alpharetta",
      "state": "GA",
      "zip": 30009.0
    
  ]

我已阅读 json.net 文档,想知道 JsonConverter class 是否有帮助。坦率地说,我不知道如何解决这个问题。 Json.net 的第一次用户,C# 的相对新手

这里是用到这里的 C# 代码:

SQLStatement = "select OBJECTID, Address, City, Region, Postal from MyAddresses";
SqlDataAdapter geoA = new SqlDataAdapter(SQLStatement, GEOconn);
DataSet GeoDS = new DataSet();
geoA.Fill(GeoDS, "records");
string geoAJSON = JsonConvert.SerializeObject(GeoDS);
Console.WriteLine("0", geoAJSON);

【问题讨论】:

【参考方案1】:

您可以使用 Json.Net 的 LINQ-to-JSON API 将行包装在具有“属性”属性的另一个对象中。

在您的代码中,替换这一行:

string geoAJSON = JsonConvert.SerializeObject(GeoDS);

用这个:

var obj = JObject.FromObject(GeoDS);
obj["records"] = new JArray(
    obj["records"].Select(jo => new JObject(new JProperty("attributes", jo)))
);
string geoAJSON = obj.ToString();

这里的工作演示:https://dotnetfiddle.net/nryw27

除此之外:根据您的 JSON,您似乎将邮政编码以小数形式存储在数据库中。不要那样做。它们可能看起来像数字,但您应该将它们存储为字符串。美国的邮政编码可以有前导零,当您将它们视为数字时,它们会被丢弃。一些国际邮政编码可以包含字母,因此在这种情况下数字类型甚至不起作用。

【讨论】:

很棒的布赖恩——这成功了。 dotnetfiddle 在确认要包含哪些库方面非常有帮助。在邮政编码字段上确认后,我已将该列定义更改为 varchar。感谢您的帮助。

以上是关于如何修改从使用 Json.Net 序列化数据集获得的 JSON 以用于 ESRI 地理编码的主要内容,如果未能解决你的问题,请参考以下文章

如何从 JSON.NET 的 JsonArray 中提取单个数组成员?

如何从 ASP.NET MVC 控制器方法返回由 JSON.NET 序列化的 camelCase JSON?

如何在数字反序列化中更改默认类型

WPF - Json.NET:如何从 Json 反序列化多个对象并将其放入列表中?

如何使用 json.net 构建用于序列化的对象层次结构?

JSON.net 直接从 oledbconnection 序列化