2012-03-25 209 views
7

我是新的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); 

我总是得到这样的错误:

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”类不匹配。 – Yogu 2012-03-25 12:37:14

+0

感谢Yogu提供的答案,但您能给我更准确的信息吗?我完全不喜欢JSON.NET。 – 2012-03-25 12:38:57

+0

看Darin Dimitrov的或我的答案。 – Yogu 2012-03-25 12:44:51

回答

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#的新手,我希望我的列表根元素具有对象集合。 – 2012-03-25 15:12:28

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 – 2012-03-25 12:44:44