将JSON反序列化到包含字典的类时获取空字段
问题描述:
写入类以反序列化JSON文件时出现问题。将JSON反序列化到包含字典的类时获取空字段
我的课是这样的:
public class Button1
{
public string Caption = "";
public Dictionary<string, Button1> Buttons;
}
public class ButtonsMenu
{
public Dictionary<string, Button1> Buttons;
}
,我尝试反序列化JSON这样:
{
"Buttons": {
"Activity": {
"btn1": {
"Caption": "Promeni sostojba"
},
"btn2": {
"Caption": "Izvrsi nesto drugo"
}
},
"Navigate": {
"btnA": {
"Caption": "Pojdi na druga forma"
},
"btnB": {
"Caption": "Otvori nesto razlicno"
}
},
"Print": {
"btnX1": {
"Caption": "Pecati nalog"
},
"btnX2": {
"Caption": "Pecati report"
}
}
}
}
与使用Json.Net的是这样的:
var buttonDef = JsonConvert.DeserializeObject<ESB.Shared.DTO.ButtonsMenu>(formDefJson);
我的问题是当我试图反序列化我的JSON时,我有三个项目Activity
,Navigate
和Print
,但字段Captions
到处都是空的。 你能告诉我我在课堂上缺少什么吗?
答
使用类
public class Btn1
{
public string Caption { get; set; }
}
public class Btn2
{
public string Caption { get; set; }
}
public class Activity
{
public Btn1 btn1 { get; set; }
public Btn2 btn2 { get; set; }
}
public class BtnA
{
public string Caption { get; set; }
}
public class BtnB
{
public string Caption { get; set; }
}
public class Navigate
{
public BtnA btnA { get; set; }
public BtnB btnB { get; set; }
}
public class BtnX1
{
public string Caption { get; set; }
}
public class BtnX2
{
public string Caption { get; set; }
}
public class Print
{
public BtnX1 btnX1 { get; set; }
public BtnX2 btnX2 { get; set; }
}
public class Buttons
{
public Activity Activity { get; set; }
public Navigate Navigate { get; set; }
public Print Print { get; set; }
}
public class RootObject
{
public Buttons Buttons { get; set; }
}
,或者使用服务来生成类http://json2csharp.com/ 希望我帮你:)
更新:,如果你想使用字典试试这个
public class Button1
{
public string Caption;
public Dictionary<string, Dictionary<string, Button1>> Buttons;
}
public class ButtonsMenu
{
public Dictionary<string, Dictionary<string, Button1>> Buttons;
}
+0
我正在使用字典,这是更复杂的类,但谢谢 –
答
它无法正常工作,因为您的JSON与您的类结构完全不匹配。有两种方法可以解决它 - 要么改变你的类,要么改变JSON。
如果你想改变的JSON,使其与您现有的类工作,那么你需要一个额外的Buttons
水平围绕内按钮对象是这样的:
{
"Buttons": {
"Activity": {
"Buttons": {
"btn1": {
"Caption": "Promeni sostojba"
},
"btn2": {
"Caption": "Izvrsi nesto drugo"
}
}
},
"Navigate": {
"Buttons": {
"btnA": {
"Caption": "Pojdi na druga forma"
},
"btnB": {
"Caption": "Otvori nesto razlicno"
}
}
},
"Print": {
"Buttons": {
"btnX1": {
"Caption": "Pecati nalog"
},
"btnX2": {
"Caption": "Pecati report"
}
}
}
}
}
小提琴:https://dotnetfiddle.net/vAWhUd
如果你宁愿改变你的类以适应你的问题中的JSON,那么你需要将外部Buttons
字典更改为嵌套字典:
public class ButtonsMenu
{
public Dictionary<string, Dictionary<string, Button1>> Buttons;
}
public class Button1
{
public string Caption = "";
}
为什么你默认将它设置为空字符串? 'public string Caption =“”' – Niladri
如果它没有值为空字符串而不为空 –
这里有两个级别,Activity是另一个字典,试着将ButtonsMenu中的按钮放到这里:'public Dictionary>按钮;'。 –