Json String没有反序列化

时间:2014-07-27 14:42:37

标签: c# json json.net

我有以下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; }
}

我尝试不使用属性和其他教程,但似乎没有任何工作.. =(

为什么它不起作用?例如,我不知道如何将返回设置为根。可能吗?

谢谢。

3 个答案:

答案 0 :(得分:4)

你的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
              }
}

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

编辑:请参阅@Crasher的回答,这正是我的意思,有一个实际的样本(虽然我没有验证,但我会赞成它),尽管@ dcastro的回答是最干净的。< / p>

dcastro的一个替代例子,如果你使用JObject来处理动态root,你也可以使用JObject.First来避免命名root,或允许root更改。请提出他的回答,我只是提供一个动态的替代方案。

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

答案 1 :(得分:4)

试试这个:

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/

答案 2 :(得分:3)

您不需要为此创建包装器/根类,正如其他人的答案所示。

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

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