在C#json对象序列化和数据契约中包装原始类型

时间:2014-06-18 18:17:10

标签: c# serialization json.net datacontractserializer

我正在尝试在可序列化的类中强烈键入一个字符串值,而我却无法弄清楚如何执行此操作。

下面是SomeValue实际上只是一个字符串值的示例,但我尝试强类型是为了防止同一类中其他字段出现混淆/编码错误。

[JsonObject(MemberSerialization.OptIn)]
[DataContract]
public class SomeObject
{
    [DataMember, JsonProperty("some_value")]
    public WrappedString SomeValue { get; set; }
}

WrappedString类看起来像这样:

public class WrappedString
{
    public readonly string Value;

    public WrappedString(string value)
    {
        Value = value;
    }
}

关于如何包装基本类型并注释应该使用构造函数来反序列化对象的类的任何想法?

1 个答案:

答案 0 :(得分:3)

您可以撰写自定义JsonConverter

var json = @"{""SomeValue"":""x"",""SomeStringValue"":""y""}";
var obj = JsonConvert.DeserializeObject<SomeObject>(json);

public class MyConverter : JsonConverter
{

    public override bool CanConvert(Type objectType)
    {
        throw new NotImplementedException();
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        return new WrappedString((string)reader.Value);
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }
}

public class SomeObject
{
    [JsonConverter(typeof(MyConverter))]
    public WrappedString SomeValue { get; set; }
    public string SomeStringValue { get; set; }
}

public class WrappedString
{
    public readonly string Value;

    public WrappedString(string value)
    {
        Value = value;
    }
}