2012-06-15 82 views
15

我有一个'简单'的方案:阅读一些JSON文件,过滤或更改一些值并将结果的json写回,而不更改原始格式。C#操纵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通过newtonsoft等等,但只有这个我能找到的是:

  • 读入对象
  • 将对象写入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.的更正式的方法。好一些。我个人不喜欢使用字符串值作为功能代码,但这只是我。如果我能接受这两个答案:我会的。我猜Shahin必须以'只'赞成一票。

+1

的故事,我还没有真正通过这个工作,但它似乎是动态类型将是这个有用的。在这里看到:http://stackoverflow.com/questions/3142495/deserialize-json-into-c-sharp-dynamic-object – McGarnagle

回答

12
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(); 
0
  1. 使用Json.net你已经创建表示您json

  2. 反序列化json到这些enties的实体,如Json.Convert<FeatureCollection>(json)

  3. 更改实体

  4. 转换回json

+0

谢谢你,但是这个我知道。我想跳过需要创建自己的对象并直接编辑反序列化数据的阶段。 – Nebula

+0

为什么你尝试反序列化JSON转换成使用json.net动态,然后改变它呢? –

1

如果你不想使用代表你的JSON的任何实体,您可以通过使用json.net反序列化到词典和修改的字典,然后使用Json.net它序列化到JSON。

0

我知道这已经回答了,但我想我有一个解决方案,其他人可能会觉得有趣。

我有一个非常大的字符串化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); 
    

这是一个有点笨重,但它的工作原理。我的生活:-)