2012-03-25 5 views
7

Я новичок в JSON.NET, и я пытаюсь десериализовать строку JSON на простой .NET-объект. Вот отрывок из моего кода:Deserialization 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); 
    } 
} 

Когда я

MessageBox.Show(deserializedPost.titre); 

Я всегда получаю эту ошибку:

Value can not be null.

Вот мой объект, который я хочу, чтобы заполнить с извлеченный элемент 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() 
     { 
     } 
    } 
} 

А вот фрагмент из моей 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

Json, который вы опубликовали, не соответствует классу 'Post', против которого вы deserialize. – Yogu

+0

Спасибо Yogu за ваш ответ, но можете ли вы дать мне более точную информацию о моей проблеме? Я полностью нов с JSON.NET. –

+0

См. Дарин Димитров или мой ответ. – Yogu

ответ

10

Структура JSON вы показали не соответствует объекту Post. Вы можете определить дополнительные классы, чтобы представить эту структуру:

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

, а затем:

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

или если вы не хотите, чтобы определить эти дополнительные объекты, которые вы могли бы сделать это:

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

Чтобы быть более точным, я новичок в C#, и мне нужна коллекция объектов с моим корневым элементом списка. –

2

JSON строка вы вывесили содержит гораздо больше, чем один Post. Чтобы десериализовать это, вам нужно создать классы для всех объектов, содержащихся в строке json, чтобы вы могли перемещаться по данным, получая доступ к свойствам.

Эти классы могут быть следующие:

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

Хорошо спасибо всем, что я понимаю сейчас, D –

Смежные вопросы