Dot-Net

JSON.NET 反序列化

  • March 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}}}},

您顯示的 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;

引用自:https://stackoverflow.com/questions/9860101