我在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包含一个应该被序列化的文本。
答案 0 :(得分:1)
由于你的c3本质上是一种不同的类型,你可以把它分开。
JSON.Net库无法序列化已经序列化的字符串。它首先需要被解析出来或者#34;反序列化"在将它送回Serializer之前。
但是如果你使用另一种方法生成C3,我建议你解除它,以便JSON.Net序列化程序能够理解需要序列化的类型,并为你提供一个正确的格式化JSON字符串。
Calendar.get(Calendar.DAY_OF_WEEK)
答案 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);
使用特殊转换器转换为字符串类型。