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

时间:2015-08-09 17:04:02

标签: 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\":12,\"name\":\"a name\"}"
};

我使用newtonsoft将数据序列化为json:

var json = JsonConvert.SerializeObject(column);

我得到了:

  

“{\” C1 \ “:\” 一些   文本\”,\ “C2 \”:\ “22 \”,\ “C3 \”:\ “{\\” ID \\ “:12,\\” 名称\\ “:\\” 一   命名\\ “} \”}“

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

  

“{\”C1 \“:\”某些文字\“,\”C2 \“:\”22 \“,\”C3 \“:{\”Id \“:22,\”名称\“ :\“一个   名\ “}}”

我该怎么做?我明白知道它的C3包含一个应该被序列化的文本。

2 个答案:

答案 0 :(得分:1)

由于你的c3本质上是一种不同的类型,你可以把它分开。

JSON.Net库无法序列化已经序列化的字符串。它首先需要被解析出来或者#34;反序列化"在将它送回Serializer之前。

但是如果你使用另一种方法生成C3,我建议你解除它,以便JSON.Net序列化程序能够理解需要序列化的类型,并为你提供一个正确的格式化JSON字符串。

Calendar.get(Calendar.DAY_OF_WEEK)

.NET fiddle

答案 1 :(得分:1)

您可以使用

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

http://www.newtonsoft.com/json/help/html/M_Newtonsoft_Json_JsonConvert_SerializeObject_4.htm

然后,您可以传递自己的转换器,它可以为您处理所需的用例,这可能看起来像这样。

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

使用特殊转换器转换为字符串类型。