如何修改使用 Json.Net 序列化 DataSet 获得的 JSON 用于 ESRI 地理编码
How to modify the JSON obtained from serializing a DataSet using Json.Net for purposes of ESRI geocoding
如何在下面的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);
您可以使用 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,您似乎将邮政编码以小数形式存储在数据库中。不要那样做。它们可能看起来像数字,但您应该将它们存储为字符串。美国的邮政编码可以有前导零,当您将它们视为数字时,这些零将被删除。一些国际邮政编码可以包含字母,因此数字类型在这种情况下甚至不起作用。
如何在下面的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);
您可以使用 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,您似乎将邮政编码以小数形式存储在数据库中。不要那样做。它们可能看起来像数字,但您应该将它们存储为字符串。美国的邮政编码可以有前导零,当您将它们视为数字时,这些零将被删除。一些国际邮政编码可以包含字母,因此数字类型在这种情况下甚至不起作用。