JSON将包装类序列化为单个JSON属性

时间:2018-03-20 12:44:51

标签: c# json.net

我有一个JSON序列化问题,我希望这里有人可能知道如何解决它。

我正在使用一个使用大量"魔术字符串的旧应用程序"对于状态等,定义为

public const string StatusActive = "active";
public const string StatusRetired = "retired";

在SQL Server数据库表中,我存储了实际的字符串表示。

这没关系 - 但有点乱。所以我决定围绕这些常量创建包装类,以确保只使用有效的字符串等。这看起来像这样:

public class StatusWrapper {
    public const string Active = "active";
    public const string Retired = "retired";

    private readonly string _value;

    public string Value 
    {
        get { return _value; }
    }

    public StatusWrapper(string value) 
    {
        switch (value) 
        {
            case Active:
            case Retired:
                _value = value;
                break;

            default:
                throw new ArgumentException($"Invalid status:={value}");
        }
    }
    .....
}

这很好用 - 现在我可以将每个状态捕获到StatusWrapper个实例中,并确保没有无效的"魔术字符串"使用。

但是当谈到JSON序列化包含这些StatusWrapper类之一的DTO时,我希望只有一个" JSON属性"以

的形式
"status":"active"

在我的JSON中 - 但由于它是一个单独的对象实例,我现在得到

"statusWrapper" : { "value":"active" }

JSON是否有任何诀窍将我的StatusWrapper类序列化为一个JSON属性?

我尝试使用自定义JSON转换器:

public class StatusWrapperSerializer : JsonConverter
{
    /// <inheritdoc />
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var statusWrapper = value as statusWrapper;

        // writer.WriteStartObject();
        writer.WritePropertyName("status");
        serializer.Serialize(writer, statusWrapper.Value);
        // writer.WriteEndObject();
    }
    ....
}

但是当我用这个客户序列化程序装饰我的StatusWrapper类时,希望只返回一个JSON属性,而是出现错误:

  

Message =状态属性中的Token PropertyName将导致无效的JSON对象。路径&#39;。

有没有办法让JSON序列化一个&#34;包装器&#34; class成单个JSON属性?如果是这样的话: HOW

1 个答案:

答案 0 :(得分:3)

您必须在WriteJson方法中只写入值(不是属性名和值)。

尝试:

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var statusWrapper = (StatusWrapper)value;
        writer.WriteValue(statusWrapper.Value);
    }