JSON序列化器-前端缺少设置为false键的布尔值时

时间:2019-08-01 13:35:02

标签: c# json typescript asp.net-core

我有一个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

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

2 个答案:

答案 0 :(得分:1)

解决方案:

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

LIVE DEMO LINK

答案 1 :(得分:0)

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

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