JSON 序列化程序 - 当布尔值设置为 false 时,前端缺少键

Posted

技术标签:

【中文标题】JSON 序列化程序 - 当布尔值设置为 false 时,前端缺少键【英文标题】:JSON serializer - when boolean value set to false key is missing on frontend 【发布时间】:2019-12-10 03:00:31 【问题描述】:

我有一个 webapi (ASP.Net Core) + 前端应用程序 (Angular)。我正在将一些存储在磁盘上的 json 文件中的数据从后端传递到前端。在前端,对于布尔属性,如果值设置为 false,我会丢失它们。使用 Newtonsoft.JSON。

假设我有以下课程:

public class Element<T>

    public Element(T value, T defaultValue, string name)
    
        Value = value;
        DefaultValue = defaultValue;
        TypeName = name
    
public T Value  get; set; 
public T DefaultValue  get; set; 
public string TypeName  get; set;

对象创建:

public class Setting

    public Element<bool> SomeBoolObject  get; set;  = new Element<bool>(false, false, "boolean");

磁盘上的 JSON 文件:

"SomeBoolObject": 
"value": false,
"defaultvalue": false,
"typename": "boolean"

然后在前端我只有


    "SomeBoolObject": 
    "typeName": "Boolean"
    

对象中缺少 Value 和 DefaultValue 键,但仅当 value 设置为 false 时。当我将其设置为 true 时,在前端我得到了所有键和值:

"SomeBoolObject": 
"value": true,
"defaultvalue": true,
"typename": "boolean"

在前端:


    "SomeBoolObject": 
    "value": 1,
    "defaultValue": 1,  
    "typeName": "Boolean"
    

这种行为的原因可能是什么?我是否需要编写一些自定义序列化程序来处理“假”值?

这有点类似于Json.net DefaultValueHandling exempting boolean alone

但建议的解决方案对我不起作用。

【问题讨论】:

您使用的是什么序列化程序? JSON.Net?或者也许是 ASP.Net Json 序列化器? 忘记添加 - Newtonsoft.JSON 【参考方案1】:

解决方案:

var serializedJson = JsonConvert.SerializeObject (SomeBoolObject, new JsonSerializerSettings 
  DefaultValueHandling = DefaultValueHandling.Include
);

LIVE DEMO LINK

【讨论】:

试过这个,但没有运气。为我缺少的属性添加 [JsonProperty(Required = Required.Always)] 可以解决问题。【参考方案2】:

我通过为属性添加一些属性来解决这个问题:

public class Element<T>

    public Element(T value, T defaultValue, string name)
    
        Value = value;
        DefaultValue = defaultValue;
        TypeName = name
    
    [JsonProperty(Required = Required.Always)]
    public T Value  get; set; 
    [JsonProperty(Required = Required.Always)]
    public T DefaultValue  get; set; 
    public string TypeName  get; set;

【讨论】:

提及有问题的 .NET/.NET Core Framework 和 Newtonsoft.Json 版本。以便其他人可能了解导致问题的原因。

以上是关于JSON 序列化程序 - 当布尔值设置为 false 时,前端缺少键的主要内容,如果未能解决你的问题,请参考以下文章

如何让 NSJSONSerialization 将布尔值输出为真或假?

Swift 和 Alamofire - 访问条件语句的 JSON 值

Python 布尔值在数据库怎么显示

为啥当我使用 JSON.NET 反序列化时会忽略我的默认值?

无法在控制台应用程序中将值''解析为类型'布尔值

如何让newtonsoft将yes和no反序列化为布尔值