为什么下面的代码为showStatusbar
返回false
?
我正在尝试使用JsonConvert.DeserializeObject
来转换Json文件。
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace test
{
class Program
{
static void Main(string[] args)
{
string jsonData = "{"Settings": [{"networkDeviceDiscovery": "supported"},{"showStatusbar":true}]}";
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(jsonData);
Console.WriteLine("NetworkDeviceDiscovery: {0}", myDeserializedClass.Settings[0].NetworkDeviceDiscovery);
Console.WriteLine("ShowStatusbar: {0}", myDeserializedClass.Settings[0].ShowStatusbar);
}
}
public class Setting
{
[JsonProperty("networkDeviceDiscovery")]
public string NetworkDeviceDiscovery;
[JsonProperty("showStatusbar")]
public bool ShowStatusbar;
}
public class Root
{
[JsonProperty("Settings")]
public List<Setting> Settings;
}
}
为了确保我们在同一页面上,这是您正在处理的JSON:
{
"Settings": [
{
"networkDeviceDiscovery": "supported"
},
{
"showStatusbar": true
}
]
}
正如您所看到的,有两个独立的对象,这意味着两个属性networkDeviceDiscovery
和showStatusbar
分别只出现在一个对象中。看这把小提琴示范一下。
在没有关于该JSON来源的更多信息的情况下,我可以建议调整Setting
类,使所有属性都可以为null,这样您就可以确定某个属性何时实际出现在JSON中:
public class Setting
{
[JsonProperty("networkDeviceDiscovery")]
public string NetworkDeviceDiscovery;
[JsonProperty("showStatusbar")]
public bool? ShowStatusbar;
}
现在,当反序列化时,只要属性没有出现在JSON中,它们就会为null。看看这把小提琴。这使您现在更容易将Settings
的列表组合为一个Setting object
:
// ...
Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(jsonData);
var resultSettings = new Setting();
foreach (var setting in myDeserializedClass.Settings)
{
if (setting.ShowStatusbar.HasValue)
{
resultSettings.ShowStatusbar = setting.ShowStatusbar;
}
// Continue with the other properties...
}
看看这最后的小提琴。
是的,如果有很多属性,这是非常乏味的,但我看不到更好的解决方案。如果你想深入研究的话,你可以使用反射来提高它的可扩展性。
注意:我不能保证这个解决方案符合API创建者的想法。但正如@Selvin提到的,这可能是由于JSON模型的糟糕设计。
我想你把大括号弄错了。试试这个:
string jsonData = "{"Settings": [{"networkDeviceDiscovery": "supported","showStatusbar":true}]}";