我有以下代码:
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
的新类型,它包装一个字符串并为这个新类型提供一个自定义转换器,直接输出该字符串。
答案 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
。