我有以下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; }
}
我尝试不使用属性和其他教程,但似乎没有任何工作.. =(
为什么它不起作用?例如,我不知道如何将返回设置为根。可能吗?
谢谢。
答案 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);
答案 2 :(得分:3)
您不需要为此创建包装器/根类,正如其他人的答案所示。
您可以将整个内容解析为JObject
,然后仅将return
节点转换为UserInfo
对象。
JObject obj = JObject.Parse(jsonStr);
var userInfo = obj["return"].ToObject<UserInfo>();