C# 操作 JSON 数据



>我有一个'简单'的场景:读取一些JSON文件,过滤或更改一些值,并在不更改原始格式的情况下将生成的json写回去。

因此,例如要更改此设置:

{
  "type": "FeatureCollection",
  "crs": {
    "type": "EPSG",
    "properties": {
      "code": 28992
    }
  },
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Polygon",
        "coordinates": [
          [
            [
              149886.192,
              374554.705
            ],
            [
              149728.583,
              374473.112
            ],
            [
              149725.476,
              374478.215
            ]
          ]
        ]
      }
    }
  ]
}

进入这个:

{
  "type": "FeatureCollection",
  "crs": {
    "type": "EPSG",
    "properties": {
      "code": 28992
    }
  },
  "features": [
    {
      "type": "Feature",
      "geometry": {
        "type": "Point",
        "coordinates": 
            [
              149886.192,
              374554.705
            ]
      }
    }
  ]
}

我已经尝试过牛顿软件等 JSON.Net,但我唯一能找到的是:

  • 读入对象
  • 将对象写入 JSON

但是我错过了"更改对象"步骤。有什么提示吗?

更新

这是我到目前为止尝试过的:

JToken contourManifest = JObject.Parse(input);
JToken features = contourManifest.SelectToken("features");
for (int i = 0; i < features.Count(); i++)
{
    JToken geometry = features[i].SelectToken("geometry");
    JToken geoType = geometry.SelectToken("type");
    JToken coordinates = geometry.SelectToken("coordinates");
    geoType = "Point";
}

但这只会更改 geoType 变量的值。我也希望更改几何图形中的值。我需要参考,而不是副本!这可能吗?

更新

我目前没有这个项目,但我想向回答者提供反馈。虽然我喜欢Shahin的简单,但我更喜欢L.B.更正式的方法。我个人不喜欢使用字符串值作为功能代码,但这只是我。如果我能接受这两个答案:我会的。我想沙欣将不得不以"只是"赞成票来弥补。

dynamic contourManifest = JObject.Parse(input);
foreach (var feature in contourManifest.features)
{
    feature.geometry.Replace(
            JObject.FromObject(
                        new { 
                            type = "Point", 
                            coordinates = feature.geometry.coordinates[0][0] 
                        }));
}
var newJson = contourManifest.ToString();
我知道

这已经得到了回答,但我认为我有一个其他人可能会觉得有趣的解决方案。

我有一个非常大的字符串化JSON对象,我从客户那里收到,需要在C#中进行操作,然后以字符串形式返回到调用应用程序。

对对象的每个方面进行建模是没有意义的,我不打算操作的许多部分经常变化,并且不能期望每次调用方修改其 JSON 对象的部分时都更新我的应用程序我没有被要求操作。 所以我试了这个,它有点丑,但它效果很好:

  1. 创建一个类 ( myClass ) 仅表示要操作的部分。
  2. 使用 Newtonsoft,创建字符串化 JSON 对象的动态版本:

    dynamic jsonObj = JsonConvert.DeserializeObject(stringifiedJsonObject);
    
  3. 使用上面创建的类(myClass)构建替换对象。然后使用

    string stringPartialJsonObj = JsonConvert.SerializeObject(myClass);
    
  4. 接下来,(这就是技巧)反序列化您刚刚创建的对象。现在,它与源的类型相同。

    dynamic partialJsonObj = JsonConvert.Deserialize(stringPartialJsonObj);
    
  5. 想象一下(为了演示)在原始 Json 对象中,我需要在 obj.ConfigurationData.Configuration1.Data 中修改对象。 这就是我会这样做的:

    jsonObj.ConfigurationData.Configuration1.Data = partialJsonObj;
    
  6. 最后,我将重新序列化整个内容并将其发送回用户:

    return JsonConvert.SerializeObject(jsonObj);
    

它有点笨拙,但它有效。 我生命中的故事:-)

如果不想使用表示 JSON 的任何实体,可以使用 json.net 反序列化为字典并修改字典,然后使用 Json.net 将其序列化为 JSON。

  1. 使用Json.net您必须创建表示json的实体

  2. json反序列化为那些像Json.Convert<FeatureCollection>(json)这样的内容

  3. 更改实体

  4. 将其转换回 json .

相关内容

  • 没有找到相关文章

最新更新