如何根据条件添加JSON属性(可能为空)?

jgwigjjp  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(133)

昨天,我需要在JSON文件中添加一个属性,我已经使用DefaultHandling完成了这一点,如this previous question所述:

[JsonProperty("DIAGNOSTICS", DefaultValueHandling = DefaultValueHandling.Populate)]
public bool DIAGNOSTICS { get; set; }

字符串
现在我在处理一个更复杂的情况:
我的源代码摘录:

[JsonProperty("NAME")]
public string NAME { get; set; }
[JsonProperty("i1.ENABLE")]
public bool i1ENABLE { get; set; }
[JsonProperty("i2.ENABLE")]
public bool i2ENABLE { get; set; }
[JsonProperty("i3ENABLE")]
public bool i3ENABLE { get; set; }
...


所需的JSON结果:

"NAME": "i1",
"i1.ENABLE": false, /* i2.ENABLE and i3.ENABLE are not shown */
...
"NAME": "i2",
"i2.ENABLE": false, /* i1.ENABLE and i3.ENABLE are not shown */
...
"NAME": "i3",
"i3.ENABLE": false, /* i1.ENABLE and i2.ENABLE are not shown */
...


所以我的问题是,这是可能的(伪代码),如果是的话,怎么做?

[JsonProperty("i1.ENABLE", DefaultValueHandling = (IF(NAME=="i1") THEN DefaultValueHandling.Populate))]
public bool i1ENABLE { get; set; }
[JsonProperty("i2.ENABLE", DefaultValueHandling = (IF(NAME=="i2") THEN DefaultValueHandling.Populate))]
public bool i2ENABLE { get; set; }
[JsonProperty("i3.ENABLE", DefaultValueHandling = (IF(NAME=="i3") THEN DefaultValueHandling.Populate))]
public bool i3ENABLE { get; set; }

编辑(在Laurent的第一个答案之后)

我的序列化代码如下:

JsonSerializerSettings js = new JsonSerializerSettings();
js.DefaultValueHandling = DefaultValueHandling.Ignore;
string temp = JsonConvert.SerializeObject(root, Formatting.Indented, js);


万一在财产申报中做不到,这里能不能做?

mklgxw1f

mklgxw1f1#

属性中不能有条件。
请尝试在常规代码中设置这些条件默认值。(属性只能有常量值)

eoxn13cs

eoxn13cs2#

您可以使用json.net的Conditional Property Serialization

class CC {
  [JsonProperty("NAME")]
  public string NAME { get; set; }

  [JsonProperty("i1.ENABLE")]
  public bool i1ENABLE { get; set; }

  [JsonProperty("i2.ENABLE")]
  public bool i2ENABLE { get; set; }

  [JsonProperty("i3.ENABLE")]
  public bool i3ENABLE { get; set; }

  public bool ShouldSerializei1ENABLE() {
    bool r = NAME == "i1";
    return r;
  }

  public bool ShouldSerializei2ENABLE() {
    bool r = NAME == "i2";
    return r;
  }

  public bool ShouldSerializei3ENABLE() {
    bool r = NAME == "i3";
    return r;
  }

}

字符串
因此,只有当ShouldSerialize[PropertyName]()返回true时,属性才会被序列化;
参见this fiddle

编辑

是的,JsonSerializerSettings中的DefaultValueHandling.Ignore可能确实会对序列化的结果产生影响。即,即使ShouldSerialize...返回true,如果属性等于默认值,它也不会被序列化(在这种特殊情况下,如果boolfalse并且DefaultValueHandling.Ignore被设置,则bool永远不会被序列化)。
因此,如果您总是希望在NAME等于i1时序列化i1ENABLE,则必须覆盖此属性的DefaultValueHandling

class CC {
  [JsonProperty("NAME")]
  public string NAME { get; set; }

  [JsonProperty("i1.ENABLE", DefaultValueHandling=DefaultValueHandling.Populate)]
  public bool i1ENABLE { get; set; }

  public bool ShouldSerializei1ENABLE() {
    bool r = NAME == "i1";
    return r;
  }
}


因此,当您按如下方式序列化时,

JsonSerializerSettings js = new JsonSerializerSettings();
js.DefaultValueHandling = DefaultValueHandling.Ignore;
string temp = JsonConvert.SerializeObject(root, Formatting.Indented, js);


NAME == "i1"时,属性i1ENABLE将 * 始终 * 被序列化,但当NAME != "i1"时,* 永远 * 不会被序列化
ShouldSerialize...可能是第一个过滤器之一,它在属性的序列化过程中完成。如果它返回false,则此属性永远不会序列化。但是如果它返回true,则仍有其他检查。其中之一是DefaultValueHandling。因此,如果DefaultValueHandling设置为Ignore,则值为false的布尔值将不会序列化,即使ShouldSerialize...返回true。
请参见updated fiddle

相关问题