似乎无法将包含布尔属性的动态列表反序列化为布尔值 我有以下json。
[
{
"Field1": 1,
"Field2": "Test 1",
"Field3": true
},
{
"Field1": 2,
"Field2": "Test 2",
"Field3": false
}
]
当我使用时:
Newtonsoft.Json.JsonConvert.DeserializeObject<List<dynamic>>(jsonString)
我得到Field3 =“True”或“False”
当绑定到网格或其他控件时,它认为这是一个“字符串”而不是“布尔”。
有什么建议吗?
答案 0 :(得分:4)
所以我尝试安装LinqPad,找出它为vendettamit工作的原因,但它在我的C#应用程序中无效。
这让我想到了How to Dump a Newtonsoft JObject in LinqPad上的这篇文章。
然后我注意到rdavisau使用了以下代码。
JsonConvert.DeserializeObject<ExpandoObject>(jsonString)
然而我正在使用以下代码。
JsonConvert.DeserializeObject<List<dynamic>>(jsonString)
所以,一旦我将代码更改为以下内容。一切正常。
JsonConvert.DeserializeObject<List<ExpandoObject>>(jsonString)
ExpandoObject是我失踪的作品。
答案 1 :(得分:2)
因为在JSON中值为true
is bool and "true"
is string,所以它似乎是一个bug。我会在issue tracker上为此创建一个新问题。
解决方法是为其创建强类型模型。
public class FieldData
{
public int Field1 {get; set;}
public string Field2 {get; set;}
public bool Field3 {get; set;}
}
JsonConvert.DeserializeObject<List<FieldData>>(jsonString);
这还具有编译时检查和更好的运行时性能的优势。
答案 2 :(得分:0)
答案 3 :(得分:0)
我跑了:
string s = "[{ \"Field1\": 1, \"Field2\": \"Test 1\", \"Field3\": true }, { \"Field1\": 2, \"Field2\": \"Test 2\", \"Field3\": false } ]";
var result = JsonConvert.DeserializeObject>(s);
Console.WriteLine("Type: {0}", result[0].Field3.Type);
它给了我: 输入:Boolean
问题可能是因为绑定期间JValue被强制转换为字符串。