Json字符串没有反序列化

本文关键字:反序列化 字符串 Json | 更新日期: 2023-09-27 18:14:59

我有以下JSON:

{"success":1,
    "return":{
              "funds": {
                      "usd":0,
                      "btc":0,
                      "ltc":0
              },
              "rights": {
                      "info":1,
                      "trade":0,
                      "withdraw":0
              },
              "transaction_count":1,
              "open_orders":0,
              "server_time":1406470221
              }
}

我试着用:

反序列化它
 JsonConvert.DeserializeObject<UserInfo>(jsonString);

类如下:

public class UserInfo
{
    [JsonProperty("transaction_count")]
    public int TransactionCount { get; set; }
    [JsonProperty("open_orders")]
    public int OpenOrders { get; set; }
    [JsonProperty("server_time")]
    public int ServerTime { get; set; }
    [JsonProperty("funds")]
    public Funds Funds { get; set; }
    [JsonProperty("rights")]
    public Rights Rights { get; set; }
}
public class Funds
{
    [JsonProperty("btc")]
    public decimal Btc { get; set; }
    [JsonProperty("ltc")]
    public decimal Ltc { get; set; }
    [JsonProperty("usd")]
    public decimal Usd { get; set; }
};
public class Rights
{
    [JsonProperty("info")]
    public bool Info { get; set; }
    [JsonProperty("trade")]
    public bool Trade { get; set; }
    [JsonProperty("withdraw")]
    public bool Withdraw { get; set; }
}

我试着不使用属性和其他教程,但似乎没有工作。= (

为什么不工作?例如,我不知道如何将return设置为根。这可能吗?

谢谢。

Json字符串没有反序列化

试试这个:

public class Funds
{
    public int usd { get; set; }
    public int btc { get; set; }
    public int ltc { get; set; }
}
public class Rights
{
    public int info { get; set; }
    public int trade { get; set; }
    public int withdraw { get; set; }
}
public class Return
{
    public Funds funds { get; set; }
    public Rights rights { get; set; }
    public int transaction_count { get; set; }
    public int open_orders { get; set; }
    public int server_time { get; set; }
}
public class RootObject
{
    public int success { get; set; }
    public Return @return { get; set; }
}

和反序列化:

JsonConvert.DeserializeObject<RootObject>(jsonString);

参考:http://json2csharp.com/

您的JSON格式不正确。

{"success":1,
    "return":{
              "funds":    <-- missing {
                      "usd":0,
                      "btc":0,
                      "ltc":0
              },
              "rights":    <-- missing {
                      "info":1,
                      "trade":0,
                      "withdraw":0
              },
              "transaction_count":1,
              "open_orders":0,
              "server_time":1406470221
              }
}

关于你关于设置根的问题,试着写一个简单的包装器类来表示你实际的JSON层次结构,然后按原样反序列化整个字符串,如果你的对象图映射到JSON,它将工作。

编辑:看看@Crasher的答案,这正是我的意思,有一个实际的样本(虽然我没有验证,但我会给它投票),虽然@dcastro的答案是最干净的。

与dcastro的确切示例不同的是,如果您使用JObject来处理动态根,您也可以使用JObject。首先避免命名根,或者允许根更改。请给他的回答点赞,我只是提供了一个动态的选择。

var root = JObject.Parse(jsonStr).First;

您不需要像其他答案建议的那样为此创建包装器/根类。

您可以将整个东西解析为JObject,然后将return节点转换为UserInfo对象。

JObject obj = JObject.Parse(jsonStr);
var userInfo = obj["return"].ToObject<UserInfo>();