2017-09-07 45 views
-1

写入类以反序列化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,NavigatePrint,但字段Captions到处都是空的。 你能告诉我我在课堂上缺少什么吗?

+0

为什么你默认将它设置为空字符串? 'public string Caption =“”' – Niladri

+1

如果它没有值为空字符串而不为空 –

+2

这里有两个级别,Activity是另一个字典,试着将ButtonsMenu中的按钮放到这里:'public Dictionary >按钮;'。 –

回答

0

使用类

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

我正在使用字典,这是更复杂的类,但谢谢 –

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 = ""; 
} 

小提琴:https://dotnetfiddle.net/1KbQoD