【问题标题】:C# Manipulating JSON dataC# 操作 JSON 数据
【发布时间】:2012-06-15 09:09:48
【问题描述】:

我有一个“简单”的场景:读取一些 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
            ]
      }
    }
  ]
}

我已经尝试过 newtonsoft 的 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 变量的值。我希望也可以更改几何形状 inside 的值。我需要参考,而不是副本!这可能吗?

更新

我目前已退出此项目,但我想向回答者提供反馈。虽然我喜欢 Shahin 的简单,但我更喜欢 L.B. 更正式的方法。好一点。我个人不喜欢使用字符串值作为功能代码,但这只是我。如果我能接受这两个答案:我愿意。我想 Shahin 将不得不“仅仅”投一个赞成票。

【问题讨论】:

标签: c# json json.net


【解决方案1】:
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();

【讨论】:

    【解决方案2】:

    我知道这个问题已经得到解答,但我认为我有一个其他人可能会感兴趣的解决方案。

    我从客户那里收到了一个非常大的字符串化 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);
      

    它有点笨拙,但它确实有效。我的生活故事:-)

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:
        1. 使用Json.net,您必须创建代表您的json的实体

        2. json反序列化为Json.Convert&lt;FeatureCollection&gt;(json)等实体

        3. 更改实体

        4. 将其转换回json

        【讨论】:

        • 谢谢,但我知道。我想跳过需要创建自己的对象并直接编辑反序列化数据的阶段。
        • 为什么尝试使用 json.net 将 json 反序列化为动态然后更改它?
        • 我想指出,JSON 文件中不存在于提供的类型中的任何元素都将保持为空,并且当对象被写回 JSON 数据时,任何空对象都将被忽略。跨度>
        猜你喜欢
        • 1970-01-01
        • 2021-03-04
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多