C# JSON.net无法找出反序列化的方法

C# JSON.net无法找出反序列化的方法,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化以下内容: [ { "items":[ { "b":1, "Q":"data" }, { "b":2, "Q":"more data" } ] }, { "seconds_ago":1 } ] 我尝试使用 public class Rootobj

我正在尝试反序列化以下内容:

[
   {
      "items":[
         {
            "b":1,
            "Q":"data"
         },
         {
            "b":2,
            "Q":"more data"
         }
      ]
   },
   {
      "seconds_ago":1
   }
]
我尝试使用

   public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public Item[] items { get; set; }
        public int seconds_ago { get; set; }
    }

    public class Item
    {
        public int b { get; set; }
        public string Q { get; set; }
    }

public void test()
{
    Rootobject deserializedObject = JsonConvert.DeserializeObject<Rootobject>(json);
}
公共类根对象
{
公共类1[]属性1{get;set;}
}
公共班级1
{
公共项[]项{get;set;}
public int seconds_ago{get;set;}
}
公共类项目
{
公共int b{get;set;}
公共字符串Q{get;set;}
}
公开无效测试()
{
Rootobject deserializedObject=JsonConvert.DeserializeObject(json);
}
但不管我尝试什么,我都会抛出各种错误,明显的用户错误

有人能告诉我如何使用JSON.net解析上面的示例吗?

以下是您的解决方案:

using System;
using Newtonsoft.Json;

public class Program
{
    public static void Main()
    {
        var data = @"{
    'Property1': [{
        'items': [{
            'b': 1,
            'Q': 'data'
        }, {
            'b': 2,
            'Q': 'more data'
        }],
        'seconds_ago': 1
    }]
}";
        Rootobject deserializedObject = JsonConvert.DeserializeObject<Rootobject>(data);
        Console.WriteLine(deserializedObject.Property1[0].items[0].b);
        Console.WriteLine(deserializedObject.Property1[0].items[0].Q);
        Console.WriteLine(deserializedObject.Property1[0].items[1].b);
        Console.WriteLine(deserializedObject.Property1[0].items[1].Q);
        Console.WriteLine(deserializedObject.Property1[0].seconds_ago);
    }
}

public class Rootobject
    {
        public Class1[] Property1 { get; set; }
    }

    public class Class1
    {
        public Item[] items { get; set; }
        public int seconds_ago { get; set; }
    }

    public class Item
    {
        public int b { get; set; }
        public string Q { get; set; }
    }
使用系统;
使用Newtonsoft.Json;
公共课程
{
公共静态void Main()
{
变量数据=@“{
“财产1”:[{
“项目”:[{
“b”:1,
“Q”:“数据”
}, {
“b”:2,
‘Q’:‘更多数据’
}],
“秒前”:1
}]
}";
Rootobject deserializedObject=JsonConvert.DeserializeObject(数据);
Console.WriteLine(反序列化Object.Property1[0].items[0].b);
Console.WriteLine(反序列化对象.Property1[0].items[0].Q);
Console.WriteLine(反序列化Object.Property1[0].items[1].b);
Console.WriteLine(反序列化对象.Property1[0].items[1].Q);
Console.WriteLine(反序列化Object.Property1[0]。秒前);
}
}
公共类根对象
{
公共类1[]属性1{get;set;}
}
公共班级1
{
公共项[]项{get;set;}
public int seconds_ago{get;set;}
}
公共类项目
{
公共int b{get;set;}
公共字符串Q{get;set;}
}
您可以在这里尝试:


问题主要是json和对象的结构。他们不匹配。看看那把小提琴,你就会明白为什么。

我想知道你是从哪里得到Json的,还是你自己想出来的。这并不是最理想的Json,但由于这是您的示例,我将向您展示如何使用映射模型对其进行反序列化

映射 要在其上进行映射的正确类(对于您提供的Json)如下所示:

public class Item
{
    public int b { get; set; }
    public string Q { get; set; }
}

public class Rootobject
{
    public List<Item> items { get; set; }
    public int? seconds_ago { get; set; }
}

您的JSON是由两个完全不同的对象组成的数组—JSON.net无法确定映射。您必须在没有模型的情况下解析它。@LukeBriggs“您必须在没有模型的情况下解析它”,这是错误的。检查我的答案。你的答案完全改变了JSON的结构。您已将
seconds\u\u
作为保存项目的对象的属性。什么?我映射了json以匹配c#类。我怎么知道@Tiago想从另一个角度得到它?他只是说我正试图反序列化这个。。。我不明白那些反对票是为了什么:(…@xszaboj想法是不更改OP提供的Json。您的
数据
变量与问题中的变量持有不同的Json字符串。因此,您…更改了Json的结构。此外…如果您使用提供的Json…您演示的代码在反序列化时将抛出错误。@Jim Yes,我同意我已经更改了JSON,但我没有更改C#对象。你只是换了一种方式而已……这是一个有效的JSON,如果它确实包含了你需要的所有信息,那么它是最佳的。它只是不适合反序列化为对象,这是真的,但这也是另一种情况,你会发现它在野外更常见think@SirRufo考虑到JSON是专门为表示对象而编写的,有人可能会说,如果它不适合反序列化为对象,那么它根本就不是最佳的:)@Rob这是从哪里来的?谈到了对象和数组——Q中的json也只包含对象和数组——但是数组只包含不同的对象类型,就像你在List@SirRufo我只是对JSON代表javascript对象表示法这一事实感到有趣——它是专门为REPRESS设计的然而,您是对的,它并不总是表示类型化数据结构的最佳方式
List<Rootobject> deserializedList = JsonConvert.DeserializeObject<List<Rootobject>>(json);