将对象名中带有日期的JSON映射到C#对象

将对象名中带有日期的JSON映射到C#对象,c#,.net,json,rest,C#,.net,Json,Rest,我有一个像这样的JSON { "rates": { "2018-05-04": { "USD": 0.2813388807, "GBP": 0.2074019228 }, "2018-08-27": { "USD": 0.2723718099, "GBP": 0.2115780848 } ...etc et

我有一个像这样的JSON

    {
    "rates": {
        "2018-05-04": {
            "USD": 0.2813388807,
            "GBP": 0.2074019228
        },
        "2018-08-27": {
            "USD": 0.2723718099,
            "GBP": 0.2115780848
        }
        ...etc etc
    },
    "start_at": "2018-01-01",
    "base": "PLN",
    "end_at": "2018-09-01"
    }
我想把它映射到C#object。我试着用,但它给了我这样的东西

public class __invalid_type__20180504
{
    public double USD { get; set; }
    public double GBP { get; set; }
}

public class __invalid_type__20180827
{
    public double USD { get; set; }
    public double GBP { get; set; }
}

public class Rates
{
    public __invalid_type__20180504 __invalid_name__2018-05-04 { get; set; }
    public __invalid_type__20180827 __invalid_name__2018-08-27 { get; set; }
}

public class RootObject
{
    public Rates rates { get; set; }
    public string start_at { get; set; }
    public string @base { get; set; }
    public string end_at { get; set; }
}

我不想让类名像“\uuu无效\u类型\uuuuuxxxxxxxx”这样,我正在寻找一种方法将其映射到一个类,这样我就有了一个类类型的列表。我使用的是
DataContractJsonSerializer
System.Net.Http.HttpClient

您实际上不需要使用工具为上述json生成类。可以有这样的根对象

public class RootObject
{
    public Dictionary<string,Rate> rates { get; set; }
    public string start_at { get; set; }
    public string @base { get; set; }
    public string end_at { get; set; }
}
由于@stefammierz在评论中提到他正在使用
DataContractJsonSerializer
,因此需要一个技巧来实现对字典的反序列化,如下所示:

var settings = new DataContractJsonSerializerSettings {UseSimpleDictionaryFormat = true};
var serializer = new DataContractJsonSerializer(typeof(RootObject),settings);

实际上,您不需要使用工具为上面提到的json生成类。可以有这样的根对象

public class RootObject
{
    public Dictionary<string,Rate> rates { get; set; }
    public string start_at { get; set; }
    public string @base { get; set; }
    public string end_at { get; set; }
}
由于@stefammierz在评论中提到他正在使用
DataContractJsonSerializer
,因此需要一个技巧来实现对字典的反序列化,如下所示:

var settings = new DataContractJsonSerializerSettings {UseSimpleDictionaryFormat = true};
var serializer = new DataContractJsonSerializer(typeof(RootObject),settings);

当JSON字段名是动态的时,即日期

您可以使用,并且您的数据将作为键:值对生成

你的课看起来像这样

        public class RootObject
        {
            public Rates rates { get; set; }
            public string start_at { get; set; }
            public string @base { get; set; }
            public string end_at { get; set; }
        }

        public class Rates
        {
            [JsonExtensionData]
            public Dictionary<string, JToken> Fields { get; set; }
        }
公共类根对象
{
公共费率{get;set;}
公共字符串start_位于{get;set;}
公共字符串@base{get;set;}
在{get;set;}处的公共字符串end_
}
公费
{
[JsonExtensionData]
公共字典字段{get;set;}
}
示例输出

关键字:2018-05-04

价值-{“美元”:0.2813388807,“英镑”:0.2074019228}


当JSON字段名是动态的,即日期时

您可以使用,并且您的数据将作为键:值对生成

你的课看起来像这样

        public class RootObject
        {
            public Rates rates { get; set; }
            public string start_at { get; set; }
            public string @base { get; set; }
            public string end_at { get; set; }
        }

        public class Rates
        {
            [JsonExtensionData]
            public Dictionary<string, JToken> Fields { get; set; }
        }
公共类根对象
{
公共费率{get;set;}
公共字符串start_位于{get;set;}
公共字符串@base{get;set;}
在{get;set;}处的公共字符串end_
}
公费
{
[JsonExtensionData]
公共字典字段{get;set;}
}
示例输出

关键字:2018-05-04

价值-{“美元”:0.2813388807,“英镑”:0.2074019228}


您只需粘贴Json并创建类并用于解析

public class RootObject
{
    [JsonProperty("rates")]
    public Dictionary<string, Dictionary<string, double>> Rates { get; set; }

    [JsonProperty("start_at")]
    public DateTimeOffset StartAt { get; set; }

    [JsonProperty("base")]
    public string Base { get; set; }

    [JsonProperty("end_at")]
    public DateTimeOffset EndAt { get; set; }
}
公共类根对象
{
[JsonProperty(“费率”)]
公共字典率{get;set;}
[JsonProperty(“起始位置”)]
public DateTimeOffset StartAt{get;set;}
[JsonProperty(“基础”)]
公共字符串基{get;set;}
[JsonProperty(“end_at”)]
公共DateTimeOffset EndAt{get;set;}
}

这是迄今为止我见过的最好、最快的方法。

您只需粘贴Json并创建类并用于解析

public class RootObject
{
    [JsonProperty("rates")]
    public Dictionary<string, Dictionary<string, double>> Rates { get; set; }

    [JsonProperty("start_at")]
    public DateTimeOffset StartAt { get; set; }

    [JsonProperty("base")]
    public string Base { get; set; }

    [JsonProperty("end_at")]
    public DateTimeOffset EndAt { get; set; }
}
公共类根对象
{
[JsonProperty(“费率”)]
公共字典率{get;set;}
[JsonProperty(“起始位置”)]
public DateTimeOffset StartAt{get;set;}
[JsonProperty(“基础”)]
公共字符串基{get;set;}
[JsonProperty(“end_at”)]
公共DateTimeOffset EndAt{get;set;}
}


这是迄今为止我见过的最好、最快的方式。

json无效-您需要日期的属性名称,因为它不知道“2018-05-04”和“2018-08-27”是什么,只需调整子类列表中的类费率(包含美元和英镑值)@Jazb我从这里得到了json@stefammierz请检查我的答案。该链接给出了无效的json该json无效-您需要日期的属性名称,因为它不知道“2018-05-04”和“2018-08-27”是什么,只需调整您的类速率yo子类列表(包含USD和GBP值)@Jazb我从这里得到了json@stefammierz请检查我的答案。该链接给出了无效的json根对象是映射的,但速率是不确定的empty@stefammierz工作完美,但这不是答案?我检查了它作为答案还有一个问题:有没有办法让“汇率”类中的货币列表可变?e、 g.一次仅gpb,其他时间为美元、欧元等。您可以使您的汇率类别包含所有货币。并将它们定义为可空。因此,只映射json中定义的对象empty@stefammierz工作完美,但这不是答案?我检查了它作为答案还有一个问题:有没有办法让“汇率”类中的货币列表可变?e、 g.一次仅gpb,其他时间为美元、欧元等。您可以使您的汇率类别包含所有货币。并将它们定义为可空。因此,只有json中定义的对象才会被映射。