无法使用JSON.NET反序列化

时间:2015-07-23 08:47:51

标签: c# json serialization

我正在尝试使用JSON.NET反序列化某些内容。这是json1.json文件:

{
 "items": [
  {
   "etag": "\"iDqJ1j7zKs4x3o3ZsFlBOwgWAHU/fxbaeehYFMlvKKyJj6WLneDJn3o\"",
   "snippet": {
    "publishedAt": "2006-09-16T18:49:25.000Z",
    "title": "New_Title_1"
   }
  }
 ]
}

这是我写的C#:(使用Newtonsoft.Json;)

public class Snippet
{
    public string publishedAt { get; set; }
    public string title { get; set; }
}

public class Item
{
    public Snippet snippet { get; set; }
    public string etag { get; set; }
}

public class RootObject
{
    public List<Item> items { get; set; }
}


namespace WebApplication1
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            using (var webClient = new System.Net.WebClient())
                {
                    var json = webClient.DownloadString("c:\\users\\User\\documents\\WebApplication1\\WebApplication1\\json1.json");
                    Response.Write(json + "<br />");

                    Item a = JsonConvert.DeserializeObject<Item>(json);
                    Response.Write(a.etag + " ----- <br />");

            }

        }
    }
}

此解决方案将构建正常,但a.etag不会打印任何内容。我哪里错了?另外:如何将已发布的和标题反序列化,因为它们嵌套在列表中(?)

2 个答案:

答案 0 :(得分:3)

您没有反序列化Item,而是RootObject

RootObject a = JsonConvert.DeserializeObject<RootObject>(json);
Response.Write(a.items[0].etag + " ----- <br />");

如果您希望List有多个条目

RootObject a = JsonConvert.DeserializeObject<RootObject>(json);

foreach (Item item in a.items)
{
    Response.Write(item.etag + " ----- <br />");
}

如果您只想拨打一个电话

RootObject a = JsonConvert.DeserializeObject<RootObject>(json);

StringBuilder sb = new StringBuilder();

foreach (Item item in a.items)
{
    sb.Append(item.etag);
    sb.AppendLine(" ----- <br />");
}

Response.Write(sb.ToString());

- 编辑

关于你的“另外:如何将已发布的和标题反序列化,因为它们嵌套在列表中?”:

只要您的类符合JSON数据格式,您就不必执行任何其他操作。在反序列化RootObject时,它们将被反序列化。

您可以像访问所有属性一样访问它

string title = a.items[0].snippet.title;

答案 1 :(得分:-2)

如何对JSON进行故障排除的最佳方法是首先通过JSON.Net对其进行序列化,然后然后您可以比较类结构的结果(并对其进行适当的更改)

  1. 创建RootObject实例并填写所有属性(包括List)
  2. JsonConvert.SerializeObject(rootObject);
  3. 序列化
  4. 将字符串结果与json1.json文件进行比较
  5. 使用示例:

    var rootObject = new RootObject
    {
        items = new List<Item>
        {
            new Item
            {
                etag = "123etag"
            }
        }
    };
    rootObject.items.FirstOrDefault().etag;