将对象序列化为已包含一个JSON属性的JSON
为了提高性能,我将一个更大的操作结果作为JSON缓存在一个表中 – 与一个键列一起确定要返回哪一行。 所以数据看起来像这样:
Id Json ---- --------- 1 {"property": "data", "...": "..."} 2 {"property": "data", "...": "..."}
因此,我检索的对象具有int .Id
和string .Json
属性。 当使用Id返回这样的对象时,我首先需要反序列化JSON – 以便正确地重新序列化。 如果我不首先反序列化它,我最终得到一个带引号的字符串,即我的返回对象看起来像这样
{ "id": 1, "json": "{\"property\": \"data\", ... }
相反,我需要:
{ "id": 1, "json": { "property": "data", ... } }
有没有办法“告诉”Json.Net序列化.Json
直接输出.Json
属性而不进行序列化 – 同时序列化其他属性?
假设您有一个这样的结构用于序列化:
public class Record { [JsonProperty("id")] public int Id { get; set; } [JsonProperty("json")] [JsonConverter(typeof(SpecialJsonConverter))] public string Json { get; set; } }
你使用这样的代码进行序列化:
var data = new [] { new Record() { Id=1, Json = "{\"property\":\"data\"}" }, new Record() { Id=2, Json = "{\"property\":\"data2\", \"property2\":[1, 2, 3]}" } }; var serialized = JsonConvert.SerializeObject(data); Console.WriteLine(serialized);
您只需要为Json属性编写适当的转换器。 幸运的是, JsonWriter类中有一个方法WriteToken可以满足我们的需求:
public sealed class SpecialJsonConverter : JsonConverter { public override bool CanConvert(Type objectType) { return true; } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { var reader = new JsonTextReader(new StringReader(value.ToString())); writer.WriteToken(reader); } }