【问题标题】:JSON serializer - when boolean value set to false key is missing on frontendJSON 序列化程序 - 当布尔值设置为 false 时,前端缺少键
【发布时间】: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

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


【解决方案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 版本。以便其他人可能了解导致问题的原因。
猜你喜欢
  • 2020-08-30
  • 1970-01-01
  • 1970-01-01
  • 2020-06-23
  • 2014-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多