2009-09-04 26 views
5

soy nuevo en Json así que un poco de verde.Deserialize json con json.net C#

Tengo un servicio basado en el resto que devuelve una cadena json;

{"treeNode":[{"id":"U-2905","pid":"R","userId":"2905"}, 
{"id":"U-2905","pid":"R","userId":"2905"}]} 

He estado jugando con el Json.net y tratando de deserializar la cadena en objetos etc. escribí un método de extensión para ayudar.

public static T DeserializeFromJSON<T>(this Stream jsonStream, Type objectType) 
     { 
      T result; 

      using (StreamReader reader = new StreamReader(jsonStream)) 
      { 
       JsonSerializer serializer = new JsonSerializer(); 
       try 
       { 
        result = (T)serializer.Deserialize(reader, objectType); 
       } 
       catch (Exception e) 
       { 
        throw; 
       } 

      } 
      return result; 
     } 

Estaba esperando una matriz de objetos treeNode []. Pero parece que solo puedo deserializar correctamente si la propiedad treeNode [] de otro objeto.

public class treeNode 
{ 
    public string id { get; set; } 
    public string pid { get; set; } 
    public string userId { get; set; } 
} 

¿Hay alguna manera de obtener una matriz directa de la deserialización?

Saludos

Respuesta

3

Se puede usar una clase anónima:

T DeserializeJson<T>(string s, T templateObj) { 
    return JsonConvert.Deserialize<T>(s); 
} 

y luego en el código:

return DeserializeJson(jsonString, new { treeNode = new MyObject[0] }).treeNode; 
0

Desafortunadamente JSON no es compatible con Tipo de información al serializar, Clase de datos de su diccionario de objetos puro en lugar de completo. Tendrá que escribir algún tipo de extensión para extender el comportamiento del serializador JSON y el deserializador a fin de admitir el ordenamiento tipo correcto.

Dar el tipo de raíz mapeará el gráfico de objetos correctamente si los tipos esperados son exactos y no derivados.

Por ejemplo, si tengo una propiedad como matriz de clase base y mi valor real puede contener clases secundarias derivadas de cualquier tipo. JSON no lo admite por completo, pero el servicio web (SOAP) le permite serializar objetos con tipeo dinámico.

+2

No, si se especifica el tipo de raíz correcta en la llamada a deserializar, Json.NET sabrán los tipos. – erikkallen

+0

¿Qué sucede si mi propiedad tiene tipo base y su valor es tipo derivado? Soap es compatible con este tipo de mapeo. JSON no lo admite por completo. –

Cuestiones relacionadas