gpt4 book ai didi

c# - 使用 C# 的条件 JSON 序列化

转载 作者:行者123 更新时间:2023-12-05 04:16:07 26 4
gpt4 key购买 nike

我有一个在 C# 中序列化为 JSON 并发布到 RESTful Web 服务的类。我有一个要求,如果一个字段已填写,则另一个字段不存在。如果两个字段都序列化为 JSON 对象,则服务错误。我的类(class)看起来像这样:

    [DataContract(Name = "test-object")]
public class TestObject
{
[DataMember(Name = "name")]
public string Name { get; set; }

// If string-value is not null or whitespace do not serialize bool-value
[DataMember(Name = "bool-value")]
public bool BoolValue { get; set; }

// If string-value is null or whitespace do not serialize it
[DataMember(Name = "string-value")]
public string StringValue { get; set; }
}

如评论中所述,如果 StringValue 有值,请不要将 BoolValue 放入 JSON 对象中。如果 StringValue 为空,则不要输入 StringValue,而是输入 BoolValue。

我找到了如何使用 XML 序列化来执行此操作,但找不到使用 JSON 序列化的方法。 C# 上有条件 JSON 序列化吗?

最佳答案

看来您正在使用 DataContractJsonSerializer .在这种情况下,您可以:

  1. 使用属性 [IgnoreDataMember] 禁用属性的直接序列化.
  2. 为序列化创建代理 stringbool? 属性,在不应序列化时返回 null。这些可以是私有(private)的
  3. 设置[DataMember(EmitDefaultValue=false)]在这些代理属性上以抑制 null 的输出。

因此:

[DataContract(Name = "test-object")]
public class TestObject
{
[DataMember(Name = "name")]
public string Name { get; set; }

[IgnoreDataMember]
public bool BoolValue { get; set; }

[IgnoreDataMember]
public string StringValue { get; set; }

bool ShouldSerializeStringValue()
{
return !String.IsNullOrWhiteSpace(StringValue);
}

// If string-value is not null or whitespace do not serialize bool-value
[DataMember(Name = "bool-value", EmitDefaultValue=false)]
bool? SerializedBoolValue {
get
{
if (!ShouldSerializeStringValue())
return BoolValue;
return null;
}
set
{
BoolValue = (value ?? false); // Or don't set it at all if value is null - your choice.
}
}

// If string-value is null or whitespace do not serialize it
[DataMember(Name = "string-value", EmitDefaultValue=false)]
string SerializedStringValue {
get
{
if (ShouldSerializeStringValue())
return StringValue;
return null;
}
set
{
StringValue = value;
}
}
}

顺便说一句,这也适用于 Json.NET , 这尊重 data contract attributes .

关于c# - 使用 C# 的条件 JSON 序列化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29173381/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com