Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 逐字输出字符串属性以防止双重编码_C#_.net_Json_Serialization_Json.net - Fatal编程技术网

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);