如何修改使用 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,您似乎将邮政编码以小数形式存储在数据库中。不要那样做。它们可能看起来像数字,但您应该将它们存储为字符串。美国的邮政编码可以有前导零,当您将它们视为数字时,这些零将被删除。一些国际邮政编码可以包含字母,因此数字类型在这种情况下甚至不起作用。