输出字符串属性逐字,以防止双重编码

时间:2015-06-30 14:35:11

标签: c# .net json serialization json.net

我有以下代码:

var data = new {
    A = "{\"X\": 5}",
    B = new {Y = 6}
};

var json = JsonConvert.SerializeObject(data);

这导致:

{
    "A": "{\"X\": 5}",
    "B": {Y: 6}
}

但是,我需要的是(A上没有引号):

{
    "A": {"X": 5},
    "B": {"Y": 6}
}

实际上,我的A属性有一个非常复杂的JSON字符串,已经被另一个系统序列化了。

解决方法是首先对我的A属性进行反序列化,然后让JSON.NET将其序列化,但这样做会浪费并混淆代码的意图。

如何告诉JSON.NET使用属性的字符串表示形式进行序列化而不是为我序列化?

编辑:

我最初的想法是创建一个名为JsonVerbatim的新类型,它包装一个字符串并为这个新类型提供一个自定义转换器,直接输出该字符串。

1 个答案:

答案 0 :(得分:4)

你可以:

public class LiteralStringConverter : JsonConverter
{
    public override bool CanConvert(Type objectType)
    {
        return objectType == typeof(string);
    }

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        object value = serializer.Deserialize(reader);
        string value2 = JsonConvert.SerializeObject(value);
        return value2;
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        string str = (string)value;
        writer.WriteRawValue(str);
    }
}

然后

public class MyObject
{
    [JsonConverter(typeof(LiteralStringConverter))]
    public string A { get; set; }

    public object B;
}

然后:

var data = new MyObject
{
    A = "{X: 5}",
    B = new { Y = 6 }
};

var json = JsonConvert.SerializeObject(data);

然后回来:

var data2 = JsonConvert.DeserializeObject<MyObject>(json);

请注意,虽然序列化现在已“优化”,但反序列化速度要慢得多,因为我反序列化为object,然后重新序列化为string