C# 将包含json的字符串转换为纯json

C# 将包含json的字符串转换为纯json,c#,json,C#,Json,我在MVC中有一个数据模型,如: public class Column { public string C1 { get; set; } public string C2 { get; set; } public string C3 { get; set; } } 每个属性都必须是字符串 它可以有如下值: var column = new Column { C1 = "Some text", C2 = "22", C3 ="{\"id\":1

我在MVC中有一个数据模型,如:

public class Column
{
    public string C1 { get; set; }
    public string C2 { get; set; }
    public string C3 { get; set; }
}
每个属性都必须是字符串

它可以有如下值:

var column = new Column { 
    C1 = "Some text",
    C2 = "22",
    C3 ="{\"id\":12,\"name\":\"a name\"}"
};
我使用newtonsoft将数据序列化为json:

var json = JsonConvert.SerializeObject(column);
我得到:

“{\'C1\\:\”一些 文本\“,\“C2\”:\“22\”,\“C3\”:\“{\\“id\\”:12,\\“名称\\”:\“a” 名称\\“}\“}”

但我希望C3被序列化为一个对象:

“{\'C1\':\'Some text\',\'C2\':\'22\',\'C3\':{\'Id\':22,\'Name\':'a” 名称\“}}”


我该怎么做?我清楚地知道是C3包含一个应该序列化的文本。

因为C3本质上是不同的类型,所以可以将其分离出来

JSON.Net库无法序列化已序列化的字符串。在将其反馈给序列化程序之前,首先需要对其进行解析或“反序列化”

但如果您使用另一种方法生成C3,我建议您将其解耦,以便JSON.Net serializer能够理解需要序列化的类型,并为您提供正确格式的JSON字符串

public class Column
    {
        public string C1 { get; set; }
        public string C2 { get; set; }
        public Column2 C3 { get; set; }
    }

    public class Column2
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }


var col2 = new Column2 { Id = 12, Name = "John Doe" };

            var column = new Column
            {
                C1 = "Some text",
                C2 = "22",
                C3 = col2
            };
            Console.WriteLine(JsonConvert.SerializeObject(column));
您可以使用

public static string SerializeObject(
    Object value,
    params JsonConverter[] converters
)

然后,您可以传递您自己的转换器,该转换器可以为您处理所需的用例,可能如下所示

 public class MyJsonConverter : JsonConverter
    {

        public override bool CanConvert(Type objectType)
        {
            return objectType.Equals(typeof(String));
        }

        public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
        {
            //no need, we are setting canRed to false. 
            return null;
        }

        public override bool CanRead
        {
            get
            {
                return false;
            }
        }

        public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
        {
            if (((String)value).StartsWith("{")){ //more accuracy required here ofc. 
                //Take that as a json String
                writer.WriteRawValue((String)value);
            }
            else
            {
                writer.WriteValue(value);
            }
        }
    }
(唯一的作用是:如果值以
{
开头,我们使用
writeRawValue
而不是
writeValue
。条件需要改进。)

最后,使用:

 JsonConverter[] converters = new JsonConverter[1];
 converters[0] = new MyJsonConverter();
 var json = JsonConvert.SerializeObject(column, converters);

使用特殊的字符串类型转换器进行转换。

是否所有属性都必须是字符串?例如,
C3
是否可以改为
IDictionary
?如果不能,则可以首先解析JSON字符串,但首先必须知道哪些属性是JSON字符串(可能是通过属性)。非常感谢你的狗鼻子-这正是我需要的。太棒了。@KennethBoChristensen不客气。我不熟悉
writer.writeValue()
-也许您需要找到一种方法来调用处理字符串的默认实现,以便执行正确的转义。但您应该能够通过一些测试来解决这个问题。我最终得到了这个解决方案。请告诉我是否应该对其进行更改:它的代码不是纯的,并且使用了包newtonsoft JSON.nett感谢您的effort,但是C3,必须是一个字符串。对于.Net fiddler来说是一个加号-不知道这个页面-非常适合这样的例子。