如何将此JSON反序列化为C#对象

时间:2020-03-05 19:15:17

标签: c# json

我具有以下JSON和类结构,但无法弄清楚如何将其反序列化为对象。

https://app.quicktype.io/

从josn自动生成类

JSON是由REST API返回的。

{
"last_executed_prices": {
    "9707645": [
        {
            "contract_id": "33837223",
            "last_executed_price": "79.37",
            "timestamp": "2020-03-04T14:33:14.711040Z"
        },
        {
            "contract_id": "33837246",
            "last_executed_price": "3.85",
            "timestamp": "2020-03-04T14:31:58.158066Z"
        },
        {
            "contract_id": "33837219",
            "last_executed_price": "36.5",
            "timestamp": "2020-03-04T14:33:10.361513Z"
        }
    ],
    "999567": [
        {
            "contract_id": "33837223",
            "last_executed_price": "79.37",
            "timestamp": "2020-03-04T14:33:14.711040Z"
        },
        {
            "contract_id": "33837246",
            "last_executed_price": "3.85",
            "timestamp": "2020-03-04T14:31:58.158066Z"
        },

        {
            "contract_id": "33837248",
            "last_executed_price": "7.69",
            "timestamp": "2020-03-04T14:32:41.560315Z"
        },
        {
            "contract_id": "33837220",
            "last_executed_price": "4.17",
            "timestamp": "2020-03-04T14:32:39.898192Z"
        }
    ]
}

}

这是类结构:

    public partial class LastExecutedPrices
{
    public Dictionary<string, List<LastExecutedPrice>> LastExecutedPricesLastExecutedPrices { get; set; }
}

public partial class LastExecutedPrice
{
    public long ContractId { get; set; }
    public string LastExecutedPriceLastExecutedPrice { get; set; }
    public DateTimeOffset Timestamp { get; set; }
}

我尝试了以下操作,但是只得到一个空对象

LastExecutedPrices data = JsonConvert.DeserializeObject<LastExecutedPrices>(badjson);

1 个答案:

答案 0 :(得分:3)

尝试一下:

public partial class Root
{
    [JsonProperty("last_executed_prices")]
    public Dictionary<string, List<LastExecutedPrice>> LastExecutedPrices { get; set; }
}

public partial class LastExecutedPrice
{
    [JsonProperty("contract_id")]
    public long ContractId { get; set; }

    [JsonProperty("last_executed_price")]
    public string LastExecutedPriceLastExecutedPrice { get; set; }

    [JsonProperty("timestamp")]
    public DateTimeOffset Timestamp { get; set; }
}

您必须创建另一个类的原因是,您的JSON是一个对象,其中包含一个名为last_executed_prices的字段,该字段是将字符串与LastExecutedPrice列表相关联的字典。

对于ContractId属性,应该将其更改为字符串类型,因为在JSON中,它用双引号引起来,因此它将反序列化为字符串。如果要将其转换为int,则必须添加一个转换器。

更新:您也可以将ContractId属性声明为long。如果该字符串是可以解析为Int64的有效数字,Newtonsoft.JSON可以将JSON中的字符串反序列化为long。

您可以通过添加以下内容轻松测试我的解决方案:

string json = @"{
    'last_executed_prices': {
        '9707645': [
            {
                'contract_id': '33837223',
                'last_executed_price': '79.37',
                'timestamp': '2020-03-04T14:33:14.711040Z'
            },
            {
                'contract_id': '33837246',
                'last_executed_price': '3.85',
                'timestamp': '2020-03-04T14:31:58.158066Z'
            },
            {
                'contract_id': '33837219',
                'last_executed_price': '36.5',
                'timestamp': '2020-03-04T14:33:10.361513Z'
            }
        ],
        '999567': [
            {
                'contract_id': '33837223',
                'last_executed_price': '79.37',
                'timestamp': '2020-03-04T14:33:14.711040Z'
            },
            {
                'contract_id': '33837246',
                'last_executed_price': '3.85',
                'timestamp': '2020-03-04T14:31:58.158066Z'
            },

            {
                'contract_id': '33837248',
                'last_executed_price': '7.69',
                'timestamp': '2020-03-04T14:32:41.560315Z'
            },
            {
                'contract_id': '33837220',
                'last_executed_price': '4.17',
                'timestamp': '2020-03-04T14:32:39.898192Z'
            }
        ]
    }
}";

Root obj = JsonConvert.DeserializeObject<Root>(json);

反序列化之后,您应该有一个有效的对象,该对象包含将字符串与LastExecutedPrice列表相关联的字典。

我希望我的解决方案会有用,如果您有任何疑问,请告诉我。