从Json创建C#类

从Json创建C#类,c#,json,C#,Json,希望使用json,它包含世界各地可用机场的列表。当我们为上述json创建类时,它将为每个机场创建类 因此,如果是10万个机场,将生成具有类似属性的10万个类。有没有办法简化这一点?我们可以使用任何泛型吗?事实上,当您使用JsonProperty属性时,这并不难 { "00AK": { "icao": "00AK", "iata": "", "

希望使用json,它包含世界各地可用机场的列表。当我们为上述json创建类时,它将为每个机场创建类


因此,如果是10万个机场,将生成具有类似属性的10万个类。有没有办法简化这一点?我们可以使用任何泛型吗?

事实上,当您使用JsonProperty属性时,这并不难

{
"00AK": {
        "icao": "00AK",
        "iata": "",
        "name": "Lowell Field",
        "city": "Anchor Point",
        "state": "Alaska",
        "country": "US",
        "elevation": 450,
        "lat": 59.94919968,
        "lon": -151.695999146,
        "tz": "America\/Anchorage"
    },
    "00AL": {
        "icao": "00AL",
        "iata": "",
        "name": "Epps Airpark",
        "city": "Harvest",
        "state": "Alabama",
        "country": "US",
        "elevation": 820,
        "lat": 34.8647994995,
        "lon": -86.7703018188,
        "tz": "America\/Chicago"
    }
}
要实例化它,请执行以下操作:

public class Class1    {
        [JsonProperty("icao")]
        public string Icao { get; set; } 

        [JsonProperty("iata")]
        public string Iata { get; set; } 

        [JsonProperty("name")]
        public string Name { get; set; } 

        [JsonProperty("city")]
        public string City { get; set; } 

        [JsonProperty("state")]
        public string State { get; set; } 

        [JsonProperty("country")]
        public string Country { get; set; } 

        [JsonProperty("elevation")]
        public int Elevation { get; set; } 

        [JsonProperty("lat")]
        public double Latitude { get; set; } 

        [JsonProperty("lon")]
        public double Longtitude { get; set; } 

        [JsonProperty("tz")]
        public string Tz { get; set; } 
    }

    

    public class Root    {
        [JsonProperty("00AK")]
        public Class1 GeoDatAK{ get; set; } 

        [JsonProperty("00AL")]
        public Class1 GeoDatAL { get; set; } 
    }

我只需要为机场创建一个类,然后反序列化到一个
字典

下面是一个更简单的例子:

[JsonConstructor]
internal Class1(string icao)
{
    this.Icao=icao;
}
var json=@“{”00AL“:{”立面“:450}”,“00AK“:{”立面“:820}”;
var obj=JsonConvert.DeserializeObject(json);
foreach(obj中的var项目){
Console.WriteLine($“{item.Key}={item.Value.Elevation}”);
}
公共级机场
{
[JsonProperty(“立面”)]
公共整数提升{get;set;}
}

您有一个airport类,可以枚举结果字典的值。如果json添加了更多的机场,您的字典将获得更多的值,但您仍然只有一个机场类

每个机场一个类。。。但是——为什么?机场对象除了包含的数据外,还有什么不同?它们需要有什么功能上的区别?不管你想用这个来解决什么问题,我打赌至少有十几种更好的方法来解决它。(但如果你坚持用这种方式解决问题,那么这个问题已经被解决了)这个问题每天都会被问到,而我们仍然没有一个规范?为一个机场创建一个类,并反序列化到
字典中
@Franz他们的意思是,如果你在JSON2Charp中粘贴这个类,或者在Visual Studio中编辑/粘贴特殊/粘贴JSON作为类,它将为每个键生成一个类,而这正是他们不想要的。这正是OP不想要的。为什么不同的类1和类2是相同的。您还没有注意到的一点是,这个JSON只是一个简单的例子,实际上可能是数千个对象(即世界机场)@jsp可以在两个属性上使用相同的类,没有压力,没有限制在两个属性上使用相同的类-您是否了解我们当时谈论的数千个属性?从技术上讲,它可能符合您的建议(尽管我不确定每个类的属性数量的限制),但实际上,如上所述,此解决方案是不可行的,因为真正的JSON可能包含>100.000(印度英语单词lakh)对象。非常感谢,我会试着让你知道……非常感谢你,我会试着让你知道……@VIGNESHWARAN这当然取决于你,我只是想知道你为什么喜欢另一种解决方案而不是这个似乎更优越的解决方案
[JsonConstructor]
internal Class1(string icao)
{
    this.Icao=icao;
}
    var json =  @"{ ""00AL"": {""elevation"":450}, ""00AK"":{""elevation"":820} }";
    var obj = JsonConvert.DeserializeObject<Dictionary<string,Airport>>(json);
         
    foreach(var item in obj) {
      Console.WriteLine($"{item.Key}={item.Value.Elevation}");
    }
        



public class Airport
{
    [JsonProperty("elevation")]
    public int Elevation { get; set; } 
}