如何修改从使用 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?