2010-07-08 11 views
8

Ejemplo:¿Cómo puedo utilizar Json.NET para modificar partes de un objeto JSON existente?

Tengo el siguiente objeto JSON.

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

Quiero ser capaz de eliminar uno o más elementos de la matriz de los servicios basados ​​en el valor del atributo name. Por ejemplo, quiero buscar name = "nyc" y eliminar el siguiente objeto de la matriz.

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

El resultado final es un objeto que se parece a esto:

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

he sido capaz de crear nuevo objeto JSON con bastante facilidad y puedo leer los ya existentes. Sin embargo, estoy teniendo dificultades para determinar la mejor manera de modificar un objeto JSON existente. Particularmente en lo que se refiere a la consulta de objetos específicos dentro del objeto JSON.

Un método que he descubierto (específico para este ejemplo) es reconstruir partes del JSON que deseo modificar y reemplazar los tokens según sea necesario. Sin embargo, tengo que pensar que hay una mejor manera. Este código se muestra a continuación.

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(); 

¿Cómo puedo utilizar Json.NET para modificar partes de un objeto JSON existente?

Respuesta

8

Aún tengo que determinar una forma alternativa de modificar un JSON existente que el proporcionado en la pregunta original. Si sale a la superficie una mejor forma, lo acepto como la respuesta correcta.

Mientras tanto, la solución que he implementado es reemplazar las partes del objeto JSON que necesito modificar con los objetos recién creados. Un ejemplo se muestra a continuación.

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(); 
Cuestiones relacionadas