2012-06-15 81 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); 
    

這是一個有點笨重,但它的工作原理。我的生活:-)