JSON.NET десериализация
Я новичок с 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);
Я всегда получаю эту ошибку:
Значение не может быть 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}}}},
2 ответа:
Структура 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;
Строка 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; } }