2012-03-25 17 views
7

Soy nuevo con JSON.NET y estoy tratando de deserializar una cadena JSON a un simple objeto .NET. Aquí hay un fragmento de mi código:Deserialización de JSON.NET

public void DeserializeFeed(string feed) 
{ 
    JsonSerializer ser = new JsonSerializer(); 
    Post deserializedPost = JsonConvert.DeserializeObject<Post>(feed); 

    if (deserializedPost == null) 
     MessageBox.Show("JSON ERROR !"); 
    else 
    { 
     MessageBox.Show(deserializedPost.titre); 
    } 
} 

Cuando hago

MessageBox.Show(deserializedPost.titre); 

siempre consigo este error:

Value can not be null.

Aquí es mi objeto que quiero llenar con el elemento JSON recuperado:

using System.Net; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Documents; 
using System.Windows.Ink; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Animation; 
using System.Windows.Shapes; 

namespace MeltyGeeks 
{ 
    public class Post 
    { 
     public String titre { get; set; } 
     public String aresum { get; set; } 

     // Constructor 
     public Post() 
     { 
     } 
    } 
} 

Y aquí es un fragmento de mi cadena JSON:

{"root_tab":{"tab_actu_fil":{"data":[{"c_origine":"MyApp", 
"titre":"title of first article", 
"aresum":"this is my first Article 
"tab_medias":{"order":{"810710":{"id_media":810710,"type":"article","format":"image","height":138,"width":300,"status":null}}}}, 
+1

El json que publicaste no coincide con la clase 'Post' contra la que te deserializas. – Yogu

+0

Gracias a Yogu por su respuesta, pero ¿puede darme información más precisa sobre mi problema? Soy completamente novato con JSON.NET. –

+0

Vea la respuesta de Darin Dimitrov o la mía. – Yogu

Respuesta

10

La estructura JSON que ha demostrado no coincide con el objeto del anuncio. Se podría definir clases adicionales para representar esta estructura:

public class Root 
{ 
    public RootTab root_tab { get; set; } 
} 

public class RootTab 
{ 
    public ActuFil tab_actu_fil { get; set; } 
} 

public class ActuFil 
{ 
    public Post[] Data { get; set; } 
} 

public class Post 
{ 
    public String titre { get; set; } 
    public String aresum { get; set; } 
} 

y luego:

string feed = ... 
Root root = JsonConvert.DeserializeObject<Root>(feed); 
Post post = root.root_tab.tab_actu_fil.Data[0]; 

o si no desea definir los objetos adicionales que podría hacer esto:

var root = JsonConvert.DeserializeObject<JObject>(feed); 
Post[] posts = root["root_tab"]["tab_actu_fil"]["data"].ToObject<Post[]>(); 
string titre = posts[0].titre; 
+0

Para ser más precisos, soy nuevo con C# y quiero una colección de objetos con mi elemento raíz de lista. –

2

La cadena JSON informados contiene mucho más que un solo Post. Para deserializarlo, debe diseñar clases para todos los objetos contenidos en la cadena json, de modo que pueda navegar a través de los datos accediendo a las propiedades.

Estas clases podrían ser las siguientes:

class Feed { 
    public RootTab root_tab { get; set; } 
} 

class RootTab { 
    public TabActuFil tab_actu_fil {get; set; } 
} 

class TabActuFil { 
    public List<Post> data { get; set; } 
} 

class Post { 
    public string c_origine {get; set; } 
    public string titre {get; set; } 
} 
+0

Ok, gracias, todo lo que entiendo ahora; D –

Cuestiones relacionadas