>我有一个'简单'的场景:读取一些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 对象的部分时都更新我的应用程序我没有被要求操作。 所以我试了这个,它有点丑,但它效果很好:
- 创建一个类 (
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);
它有点笨拙,但它有效。 我生命中的故事:-)
如果不想使用表示 JSON 的任何实体,可以使用 json.net 反序列化为字典并修改字典,然后使用 Json.net 将其序列化为 JSON。
-
使用
Json.net
您必须创建表示json
的实体 -
将
json
反序列化为那些像Json.Convert<FeatureCollection>(json)
这样的内容 -
更改实体
-
将其转换回
json
.