C# 逐字输出字符串属性以防止双重编码
我有以下代码:C# 逐字输出字符串属性以防止双重编码,c#,.net,json,serialization,json.net,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} } 但是,我需要的是,在一个 实际上,MyA属性有一个非常复杂的JSON字符串,该字符串已经被另一个系统序列化 一种解决方法是首先反序列化我的A属性,然后让JSON.NE
var data = new {
A = "{\"X\": 5}",
B = new {Y = 6}
};
var json = JsonConvert.SerializeObject(data);
这导致:
{
"A": "{\"X\": 5}",
"B": {Y: 6}
}
但是,我需要的是,在一个
实际上,MyA属性有一个非常复杂的JSON字符串,该字符串已经被另一个系统序列化
一种解决方法是首先反序列化我的A属性,然后让JSON.NET将其序列化回来,但是这是浪费并且混淆了代码的意图
我如何告诉JSON.NET使用属性的字符串表示进行序列化,而不是为我序列化它
编辑:
我最初的想法是创建一个名为JsonVerbatim的新类型,它包装一个字符串,并为这个新类型提供一个自定义转换器,直接输出该字符串。您可以:
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);
}
}
然后
然后:
var data = new MyObject
{
A = "{X: 5}",
B = new { Y = 6 }
};
var json = JsonConvert.SerializeObject(data);
返回:
var data2 = JsonConvert.DeserializeObject<MyObject>(json);
请注意,虽然序列化现在已优化,但反序列化速度会加倍缓慢,因为我将反序列化为object,然后将其重新序列化为string。如果输入为{X:5},并且在JSON中得到的值没有双引号,我不确定代码的意图,我可能会更困惑。也许一个自定义转换器的JsonConverter属性只应用于该属性?@Habib我不打算在所有字符串上都有这种行为,只是某些我不想被编码为javascript字符串的字符串。快速简单的方法是,它正在反序列化,然后重新序列化:var data=new{A=JObject.Parse{X:5},…}另外,我假设您所发布的只是一个示例,但在本例中,A的值实际上不是有效的JSON。您需要在字符串中引用X。这正是我需要的,谢谢。我不担心反序列化性能,因为在我的场景中不需要它,但很高兴将来知道。
var data = new MyObject
{
A = "{X: 5}",
B = new { Y = 6 }
};
var json = JsonConvert.SerializeObject(data);
var data2 = JsonConvert.DeserializeObject<MyObject>(json);