2012-03-25 20 views
7

Jestem nowy z JSON.NET i próbuję deserializować łańcuch JSON do prostego obiektu .NET. Oto fragment mojego kodu:deserializacja 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); 
    } 
} 

Kiedy zrobić

MessageBox.Show(deserializedPost.titre); 

zawsze uzyskać ten błąd:

Value can not be null.

Oto mój obiekt, który chcę napełnić pobrany element JSON:

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() 
     { 
     } 
    } 
} 

A oto fragment mojego JSON ciąg:

{"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

Wysłany przez ciebie json nie pasuje do klasy 'Post', której deserializujesz. – Yogu

+0

Dzięki Yogu za odpowiedź, ale czy możesz podać dokładniejsze informacje na temat mojego problemu? Jestem całkowicie noob z JSON.NET. –

+0

Zobacz Darina Dimitrowa lub moją odpowiedź. – Yogu

Odpowiedz

10

Struktura JSON zostały pokazane nie pasuje do obiektu Post. Można zdefiniować dodatkowe zajęcia do reprezentowania tej struktury:

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; } 
} 

a następnie:

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

lub jeśli nie chcesz, aby określić te dodatkowe przedmioty można to zrobić:

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

Aby być dokładniejszym, jestem nowy z C# i chcę kolekcję obiektów z moim głównym elementem listy. –

2

Ciąg json ty pisał zawiera znacznie więcej niż jednym Post. Aby deserializować go, należy zaprojektować klasy dla wszystkich obiektów zawartych w łańcuchu json, aby można było nawigować po danych, uzyskując dostęp do właściwości.

zajęcia te mogą być następujące:

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 dziękuje wszystko, co teraz rozumiem; D –

Powiązane problemy