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。
-
使用
Json.net
你必须创建代表你的json
的实体 -
将
json
反序列化为像Json.Convert
(json) -
更改实体
-
将其转换回
json
。
我知道这已经得到了解答,但我认为我有一个别人可能会感兴趣的解决方案。
我有一个非常大的字符串化JSON对象,我从客户那里收到并需要在C#中操作,然后以字符串forms返回给调用应用程序。
对对象的每个方面进行建模是没有意义的,我计划操作的许多部分经常变化,每次调用者修改他们的JSON对象的部分我都不能期望更新我的应用程序被要求操纵。 所以我尝试了这个,它有点难看,但效果很好:
- 创建一个表示您想要操作的部分的类(
myClass
)。 -
使用Newtonsoft,创建字符串化JSON对象的动态版本:
dynamic jsonObj = JsonConvert.DeserializeObject(stringifiedJsonObject);
-
使用上面创建的类(
myClass
)构建替换对象。 然后使用序列化该对象string stringPartialJsonObj = JsonConvert.SerializeObject(myClass);
-
接下来,(这是技巧)反序列化刚刚创建的对象。 现在它与您的源类型相同。
dynamic partialJsonObj = JsonConvert.Deserialize(stringPartialJsonObj);
-
想象一下(为了这个演示)在原始的Json对象中,我需要修改
obj.ConfigurationData.Configuration1.Data
的对象。 我就是这样做的:jsonObj.ConfigurationData.Configuration1.Data = partialJsonObj;
-
最后,我重新序列化整个事情并将其发送给用户:
return JsonConvert.SerializeObject(jsonObj);
它有点笨重,但它的工作原理。 我的生活故事:-)