Newtonsoft Json反序列化为动态列表,boolean属性变为字符串

时间:2016-12-07 19:44:06

标签: c# json json.net

似乎无法将包含布尔属性的动态列表反序列化为布尔值 我有以下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”
当绑定到网格或其他控件时,它认为这是一个“字符串”而不是“布尔”。

有什么建议吗?

4 个答案:

答案 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)

我只是尝试使用JSON.NET 9.0.1在LINQPAD中复制代码。我没有看到那里的问题:

enter image description here

答案 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被强制转换为字符串。