【问题标题】:Getting empty fields when deserializing JSON to my classes containing dictionaries将 JSON 反序列化为包含字典的类时获取空字段
【发布时间】:2017-09-07 07:27:33
【问题描述】:

我在编写类以反序列化 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 时,我有 ActivityNavigatePrint 这三个项目,但 Captions 字段到处都是空的。 你能告诉我我在课堂上缺少什么吗?

【问题讨论】:

  • 为什么默认设置为空字符串? public string Caption = ""
  • 如果它没有值为空字符串且不为空
  • 你这里有两个级别,Activity是另一个字典,试着把ButtonsMenu中的Buttons变成这个:public Dictionary&lt;string, Dictionary&lt;string, Button1&gt;&gt; Buttons;

标签: c# json serialization json.net


【解决方案1】:

使用类

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

【讨论】:

  • 我正在使用字典,这是更复杂的类,但谢谢
【解决方案2】:

它不起作用,因为您的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多