Pet*_*ert 4 .net c# json.net asp.net-web-api
为了提高性能,我将一个更大的操作的结果作为JSON缓存在一个表中 - 与一个键列一起确定要返回哪一行.所以数据看起来像这样:
Id Json
---- ---------
1 {"property": "data", "...": "..."}
2 {"property": "data", "...": "..."}
Run Code Online (Sandbox Code Playgroud)
因此,我检索的对象具有int .Id和string 属性.Json.当使用Id返回这样的对象时,我首先需要反序列化JSON - 以便正确地重新序列化.如果我不首先反序列化它,我最终得到一个带引号的字符串,即我的返回对象看起来像这样
{
"id": 1,
"json": "{\"property\": \"data\", ...
}
Run Code Online (Sandbox Code Playgroud)
相反,我需要:
{
"id": 1,
"json": {
"property": "data",
...
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法"告诉"Json.Net序列化程序.Json直接输出属性而不进行序列化 - 同时序列化其他属性?
假设您有一个这样的结构用于序列化:
public class Record
{
[JsonProperty("id")]
public int Id
{
get;
set;
}
[JsonProperty("json")]
[JsonConverter(typeof(SpecialJsonConverter))]
public string Json
{
get;
set;
}
}
Run Code Online (Sandbox Code Playgroud)
你使用这样的代码进行序列化:
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);
Run Code Online (Sandbox Code Playgroud)
您只需要为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);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2349 次 |
| 最近记录: |