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 ] } } ] } 

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

更新

我目前不参与此项目,但我想向答复者提供反馈意见。 虽然我喜欢Shahin的简单性,但我更喜欢LB更正式的方法。 我个人不喜欢使用字符串值作为function代码,但那只是我。 如果我能接受这两个答案:我愿意。 我猜Shahin将不得不用’just’一个upvote来做到。

 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的实体,您可以使用json.net反序列化为Dictionary并修改字典,然后使用Json.net将其序列化为JSON。

  1. 使用Json.net你必须创建代表你的json的实体

  2. json反序列化为像Json.Convert(json)

  3. 更改实体

  4. 将其转换回json

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

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

对对象的每个方面进行建模是没有意义的,我计划操作的许多部分经常变化,每次调用者修改他们的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); 

它有点笨重,但它的工作原理。 我的生活故事:-)