【问题标题】:Losing data when deserializing bool反序列化 bool 时丢失数据
【发布时间】:2019-01-22 01:03:19
【问题描述】:

我正在尝试将 JSON 反序列化为自制对象 A,其中包含 2 个字符串和另一个对象 B 的列表。对象 B 由另一个字符串和一个布尔值组成。

示例 JSON:

{  
   "ButtonList":[  
      {  
         "Fast":false,
         "Name":"TableOverview"
      },
      {  
         "Fast":true,
         "Name":"Evaluation"
      }
   ],
   "FavoritGraphic":"PDFreport",
   "FavoritText":"Findings"
}

JSON 的语法经过双重检查且正确无误。没有 bool 的测试也可以正常工作。但是当我尝试使用 bool 反序列化对象时,List 为空(收藏夹字符串仍然具有正确的值)。我无法弄清楚我在这里做错了什么......

public class ButtonSettingsModel
{
  public readonly string FavoritText;
  public readonly string FavoritGraphic;
  public readonly List<ButtonInfo> ButtonList;

  public ButtonSettingsModel(string favoritText, string favoritGraphic, List<ButtonInfo> fastButtons)
  {
    FavoritText = favoritText;
    FavoritGraphic = favoritGraphic;
    ButtonList = fastButtons;
  }
}

public class ButtonInfo
{
  public readonly string Name;
  public readonly bool Fast;

  public ButtonInfo(string name, bool fast)
  {
    Name = name;
    Fast = fast;
  }
}

ButtonSettingsModel ButtonSettings = GetObjectFromJson<ButtonSettingsModel>(jsonString);

public T GetObjectFromJson<T>(string jsonString) // correct json
{
  var foo = JsonConvert.DeserializeObject<T>(jsonString); // List == null
  return foo;
}

【问题讨论】:

  • 你能分享一下Json示例吗?
  • @AnuViswan 完成

标签: c# json.net


【解决方案1】:

这是关于构造函数参数的命名。虽然不区分大小写,但 JSON.Net 确实需要将它们匹配起来。

要么改变json数组名匹配构造函数,要么改变构造函数匹配json:

void Main()
{
    string jsonString = @"{  
   ""buttonList"":[
      {  
         ""Name"":""TableOverview"",
         ""Fast"":false         
      },
      {
         ""Name"":""Evaluation""
      }
   ],
   ""FavoritGraphic"":""PDFreport"",
   ""FavoritText"":""Findings""
}";


    ButtonSettingsModel ButtonSettings = GetObjectFromJson<ButtonSettingsModel>(jsonString);
    //ButtonSettings.Dump();
}

// Define other methods and classes here
public class ButtonSettingsModel
{
    public readonly string FavoritText;
    public readonly string FavoritGraphic;
    public readonly List<ButtonInfo> ButtonList;

    public ButtonSettingsModel(string favoritText, string favoritGraphic, List<ButtonInfo> buttonList)
    {
        FavoritText = favoritText;
        FavoritGraphic = favoritGraphic;
        ButtonList = buttonList;
    }
}

public class ButtonInfo
{
    public readonly string Name;
    public readonly bool Fast;

    public ButtonInfo(string name, bool fast)
    {
        Name = name;
        Fast = fast;
    }
}

public T GetObjectFromJson<T>(string jsonString) // correct json
{
    var foo = JsonConvert.DeserializeObject<T>(jsonString); // List != null
    return foo;
}

【讨论】:

  • 做到了。非常感谢
猜你喜欢
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多