昨天,我需要在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);
型
万一在财产申报中做不到,这里能不能做?
2条答案
按热度按时间mklgxw1f1#
属性中不能有条件。
请尝试在常规代码中设置这些条件默认值。(属性只能有常量值)
eoxn13cs2#
您可以使用json.net的Conditional Property Serialization
字符串
因此,只有当
ShouldSerialize[PropertyName]()
返回true
时,属性才会被序列化;参见this fiddle
编辑
是的,
JsonSerializerSettings
中的DefaultValueHandling.Ignore
可能确实会对序列化的结果产生影响。即,即使ShouldSerialize...
返回true
,如果属性等于默认值,它也不会被序列化(在这种特殊情况下,如果bool
是false
并且DefaultValueHandling.Ignore
被设置,则bool
永远不会被序列化)。因此,如果您总是希望在
NAME
等于i1
时序列化i1ENABLE
,则必须覆盖此属性的DefaultValueHandling
。型
因此,当您按如下方式序列化时,
型
当
NAME == "i1"
时,属性i1ENABLE
将 * 始终 * 被序列化,但当NAME != "i1"
时,* 永远 * 不会被序列化ShouldSerialize...
可能是第一个过滤器之一,它在属性的序列化过程中完成。如果它返回false
,则此属性永远不会序列化。但是如果它返回true
,则仍有其他检查。其中之一是DefaultValueHandling
。因此,如果DefaultValueHandling
设置为Ignore
,则值为false
的布尔值将不会序列化,即使ShouldSerialize...
返回true。请参见updated fiddle