简体   繁体   中英

JSON serialize a wrapper class into a single JSON property

I have a JSON serialization problem and I hope someone here might have an idea how to solve it.

I am working with an older application that uses a lot of "magic strings" for statuses etc., which are defined as

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

In the SQL Server database table, I am storing the actual string representation.

This is OK - but a bit messy. So I decided to create wrapper classes around those constants, to ensure only valid strings will be used etc. These looks someting like this:

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}");
        }
    }
    .....
}

This works fine - now I can capture each status into a StatusWrapper instance, and ensure no invalid "magic strings" are used.

But when it comes to JSON serialize a DTO which contains one of these StatusWrapper classes, I would like to have just a single "JSON property" in the form of

"status":"active"

in my JSON - but since it's a separate object instance, I now get

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

Is there any trick to JSON serialize my StatusWrapper class as just a single JSON property?

I tried using a custom JSON converter:

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();
    }
    ....
}

but when I decorate my StatusWrapper class with this customer serializer, hoping to get just a single JSON property back, I instead get an error:

Message=Token PropertyName in state Property would result in an invalid JSON object. Path ''.

Is there a way to JSON serialize a "wrapper" class into a single JSON property? And if so: HOW ?

You must write only the value (not both property name and the value) in WriteJson method.

Try:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM