【问题标题】:JSON.NET deserializationJSON.NET 反序列化
【发布时间】:2012-04-09 05:55:23
【问题描述】:

我是 JSON.NET 的新手,我正在尝试将 JSON 字符串反序列化为一个简单的 .NET 对象。 这是我的代码的 sn-p:

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 字符串的 sn-p:

{"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 类不匹配。
  • 感谢 Yogu 的回答,但您能否就我的问题提供更准确的信息?我对 JSON.NET 完全不熟悉。
  • 查看 Darin Dimitrov 或我的回答。

标签: .net json serialization json.net deserialization


【解决方案1】:

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

【讨论】:

  • 更准确地说,我是 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; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-18
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多