C# 反序列化包含另一个对象的json对象

C# 反序列化包含另一个对象的json对象,c#,json,json.net,C#,Json,Json.net,我正在尝试反序列化此json文件: { "result": { "car1":{"lat":37.989728,"long":23.664633}, "car2":{"lat":38.008027,"long":23.774068} } } 我试过这样做: public static void parseJson(string data) { Result all = JsonConvert.DeserializeObject

我正在尝试反序列化此json文件:

{
   "result":
     {
        "car1":{"lat":37.989728,"long":23.664633},
        "car2":{"lat":38.008027,"long":23.774068}
     }
}
我试过这样做:

public static void parseJson(string data)
{
     Result all = JsonConvert.DeserializeObject<Result>(data);  
}

public class Result
{
     public Car Car { get; set; }
}

public class Car
{
     public string lat { get; set; }
     public string lon { get; set; }
}
class Result
{
    [JsonProperty("result")]
    public Dictionary<string, Car> Cars { get; set; }
}

class Car
{
    public decimal Lat { get; set; }
    public decimal Long { get; set; }
}
publicstaticvoidparsejson(字符串数据)
{
结果all=JsonConvert.DeserializeObject(数据);
}
公开课成绩
{
公共小汽车{get;set;}
}
公车
{
公共字符串lat{get;set;}
公共字符串lon{get;set;}
}

但是对象
all
保持为null

JSON中的对象有两个属性,
car1
car2
,因此要将其映射到的类(
Result
)应该有这两个属性:

public class Result
{
     public Car car1 { get; set; }
     public Car car2 { get; set; }
}

下面是您的评论:


好的,但那两辆车就是一个例子。实际上,每次我获取json时,汽车的数量都会有所不同

在这种情况下,JSON必须更改以使用数组:

{
   "result":
     {
        cars: [
            {"lat":37.989728,"long":23.664633},
            {"lat":38.008027,"long":23.774068}
        ]
     }
}
然后我认为
结果
类应该是:

public class Result
{
     public List<Car> cars { get; set; }
}

(如果除了cars之外没有任何其他内容,您可能可以删除中间对象。)

JSON中的对象有两个属性,
car1
car2
,因此您要将其映射到的类(
Result
)应该有这两个属性:

public class Result
{
     public Car car1 { get; set; }
     public Car car2 { get; set; }
}

下面是您的评论:


好的,但那两辆车就是一个例子。实际上,每次我获取json时,汽车的数量都会有所不同

在这种情况下,JSON必须更改以使用数组:

{
   "result":
     {
        cars: [
            {"lat":37.989728,"long":23.664633},
            {"lat":38.008027,"long":23.774068}
        ]
     }
}
然后我认为
结果
类应该是:

public class Result
{
     public List<Car> cars { get; set; }
}

(如果你除了汽车之外没有任何东西,你也许可以去掉中间对象。)

参考下面的代码片段,希望它能帮助你

class WeapsCollection
{
    public Dictionary<string, WeaponDetails> Weapons { get; set; }

}

class WeaponList
{
    public WeaponDetails AEK { get; set; }
    public WeaponDetails XM8 { get; set; }
}

class WeaponDetails
{
    public string Name { get; set; }
    public int Kills { get; set; }
    public int Shots_Fired { get; set; }
    public int Shots_Hit { get; set; }
}

class Program  
{
    static void Main(string[] args)
    {
        string json = @"
        {
           'weapons':

                    {
                       'aek':
                            {
                               'name':'AEK-971 Vintovka',
                               'kills':47,
                               'shots_fired':5406,
                               'shots_hit':858
                            },
                       'xm8':
                            {
                               'name':'XM8 Prototype',
                               'kills':133,
                               'shots_fired':10170,
                               'shots_hit':1790
                            },
                    }

        }";

        WeapsCollection weps = JsonConvert.DeserializeObject<WeapsCollection>(json);
        Console.WriteLine(weps.Weapons.First().Value.Shots_Fired);            

        Console.ReadLine();

    }
}
类武器集合
{
公共字典{get;set;}
}
阶级武器清单
{
公共武器详细信息AEK{get;set;}
公共武器详细信息XM8{get;set;}
}
阶级武器细节
{
公共字符串名称{get;set;}
公共int杀死{get;set;}
公共int Shots_Fired{get;set;}
公共int Shots_Hit{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串json=@”
{
“武器”:
{
“aek”:
{
“名称”:“AEK-971 Vintovka”,
“杀死”:47,
“开枪”:5406,
“射门命中”:858
},
“xm8”:
{
“名称”:“XM8原型”,
"杀":133,,
“开枪”:10170,
“投篮命中”:1790
},
}
}";
WeapsCollection weps=JsonConvert.DeserializeObject(json);
Console.WriteLine(weps.weps.wearms.First().Value.Shots\u Fired);
Console.ReadLine();
}
}

参考下面的代码片段,希望它能帮助您

class WeapsCollection
{
    public Dictionary<string, WeaponDetails> Weapons { get; set; }

}

class WeaponList
{
    public WeaponDetails AEK { get; set; }
    public WeaponDetails XM8 { get; set; }
}

class WeaponDetails
{
    public string Name { get; set; }
    public int Kills { get; set; }
    public int Shots_Fired { get; set; }
    public int Shots_Hit { get; set; }
}

class Program  
{
    static void Main(string[] args)
    {
        string json = @"
        {
           'weapons':

                    {
                       'aek':
                            {
                               'name':'AEK-971 Vintovka',
                               'kills':47,
                               'shots_fired':5406,
                               'shots_hit':858
                            },
                       'xm8':
                            {
                               'name':'XM8 Prototype',
                               'kills':133,
                               'shots_fired':10170,
                               'shots_hit':1790
                            },
                    }

        }";

        WeapsCollection weps = JsonConvert.DeserializeObject<WeapsCollection>(json);
        Console.WriteLine(weps.Weapons.First().Value.Shots_Fired);            

        Console.ReadLine();

    }
}
类武器集合
{
公共字典{get;set;}
}
阶级武器清单
{
公共武器详细信息AEK{get;set;}
公共武器详细信息XM8{get;set;}
}
阶级武器细节
{
公共字符串名称{get;set;}
公共int杀死{get;set;}
公共int Shots_Fired{get;set;}
公共int Shots_Hit{get;set;}
}
班级计划
{
静态void Main(字符串[]参数)
{
字符串json=@”
{
“武器”:
{
“aek”:
{
“名称”:“AEK-971 Vintovka”,
“杀死”:47,
“开枪”:5406,
“射门命中”:858
},
“xm8”:
{
“名称”:“XM8原型”,
"杀":133,,
“开枪”:10170,
“投篮命中”:1790
},
}
}";
WeapsCollection weps=JsonConvert.DeserializeObject(json);
Console.WriteLine(weps.weps.wearms.First().Value.Shots\u Fired);
Console.ReadLine();
}
}

如果您将类设置为这样,您可以获得所需的内容:

public static void parseJson(string data)
{
     Result all = JsonConvert.DeserializeObject<Result>(data);  
}

public class Result
{
     public Car Car { get; set; }
}

public class Car
{
     public string lat { get; set; }
     public string lon { get; set; }
}
class Result
{
    [JsonProperty("result")]
    public Dictionary<string, Car> Cars { get; set; }
}

class Car
{
    public decimal Lat { get; set; }
    public decimal Long { get; set; }
}

如果您将课程设置为这样,您可以获得所需的内容:

public static void parseJson(string data)
{
     Result all = JsonConvert.DeserializeObject<Result>(data);  
}

public class Result
{
     public Car Car { get; set; }
}

public class Car
{
     public string lat { get; set; }
     public string lon { get; set; }
}
class Result
{
    [JsonProperty("result")]
    public Dictionary<string, Car> Cars { get; set; }
}

class Car
{
    public decimal Lat { get; set; }
    public decimal Long { get; set; }
}

好的,但那两辆车就是一个例子。实际上,每次我获取json时,汽车的数量都会有所不同。如何管理它?@jayt.dev:在这种情况下,您需要JSON中的数组,而不是离散属性。我已经更新了答案。谢谢你的回答。但json是http请求对API的响应,因此我无法更改它。我必须弄清楚如何处理现有的格式。@jayt.dev:这是一个严重破坏的API。不幸的是,我认为您必须使用JSON.Net提供的原始JSON对象编写代码。几年前我就这么做了,但我不记得细节了。你不会自动映射到一个类,因为如果你不知道会有多少个
carX
属性,你就不能定义这个类。如果我创建另一个类坐标{lat{get set}lon{get set}},在Cars中有公共坐标coordinateOK,那么这两个Cars就是一个例子。实际上,每次我获取json时,汽车的数量都会有所不同。如何管理它?@jayt.dev:在这种情况下,您需要JSON中的数组,而不是离散属性。我已经更新了答案。谢谢你的回答。但json是http请求对API的响应,因此我无法更改它。我必须弄清楚如何处理现有的格式。@jayt.dev:这是一个严重破坏的API。不幸的是,我认为您必须使用JSON.Net提供的原始JSON对象编写代码。几年前我就这么做了,但我不记得细节了。你不会得到aut的