2010-07-08 38 views
8

示例:如何最好地利用Json.NET來修改現有JSON對象的某些部分?

我有以下JSON對象。

{"currentVersion" : "10.0", 
    "folders" : [], 
    "services" : [ 
    {"name" : "nyc", "type" : "MapServer"}, 
    {"name" : "philly", "type" : "MapServer"} 
    ] 
} 

我希望能夠根據name屬性的值從services數組中刪除一個或多個項目。例如,我想搜索名稱=「nyc」,並從數組中刪除以下對象。

{"name" : "nyc", "type" : "MapServer"} 

最終的結果是一個對象,它是這樣的:我已經能夠非常輕鬆地創建新的JSON對象

{"currentVersion" : "10.0", 
    "folders" : [], 
    "services" : [ 
    {"name" : "philly", "type" : "MapServer"} 
    ] 
} 

,我可以讀現有的。但是,我很難確定修改現有JSON對象的最佳方法。特別是因爲它涉及查詢JSON對象內的特定對象。

我發現的一個方法(特定於此示例)是重新構建我想要修改的JSON部分,並根據需要替換這些標記。但是,我必須認爲有一個更好的方法。該代碼如下所示。

string json = @"{""currentVersion"" : ""10.0"", 
        ""folders"" : [], 
        ""services"" : [ 
         {""name"" : ""nyc"", ""type"" : ""MapServer""}, 
         {""name"" : ""philly"", ""type"" : ""MapServer""} 
        ] 
       }"; 

string[] keepList = new string[] { "nyc" }; 

JObject o = JObject.Parse(json); 
JArray services = (JArray)o["services"]; 
JArray newServices = new JArray(); 

foreach (JToken service in services) 
{ 
    foreach (string keeper in keepList) 
    { 
     if ((string)service["name"] == keeper) 
     { 
      newServices.Add(service); 
      break; 
     } 
    } 
} 

services.Replace(newServices); 

string output = o.ToString(); 

如何最好地利用Json.NET來修改現有JSON對象的某些部分?

回答

8

我還沒有確定修改現有JSON的替代方法,而不是原始問題中提供的方法。如果更好的方式表面,我會很樂意接受,作爲正確的答案。

與此同時,我實現的解決方案是用新創建的對象替換我需要修改的JSON對象的部分。一個例子如下所示。

string json = @"{""currentVersion"" : ""10.0"", 
        ""folders"" : [], 
        ""services"" : [ 
         {""name"" : ""nyc"", ""type"" : ""MapServer""}, 
         {""name"" : ""philly"", ""type"" : ""MapServer""} 
        ] 
       }"; 

string[] keepList = new string[] { "nyc" }; 

JObject o = JObject.Parse(json); 
JArray services = (JArray)o["services"]; 
JArray newServices = new JArray(); 

foreach (JToken service in services) 
{ 
    foreach (string keeper in keepList) 
    { 
     if ((string)service["name"] == keeper) 
     { 
      newServices.Add(service); 
      break; 
     } 
    } 
} 

services.Replace(newServices); 

string output = o.ToString();