Десериализация JSON.NET - PullRequest
       13

Десериализация JSON.NET

7 голосов
/ 25 марта 2012

Я новичок в JSON.NET и пытаюсь десериализовать строку 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);

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

Значение не может быть нулевым.

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

Ответы [ 2 ]

10 голосов
/ 25 марта 2012

Показанная вами структура 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;
2 голосов
/ 25 марта 2012

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

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

...