如何有效地在JsonConverter.ReadJson()
中获取完整的json字符串?
我可以做到:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var json = JObject.Load(reader).ToString(Formatting.None);
但是,由于我无缘无故地进行序列化和反序列化,这似乎效率很低
还有更好的方法吗?
答案 0 :(得分:2)
ReadJson()
必须完全解析正在读取的JSON,以便确认JSON格式正确,并且JsonReader
正确放置在当前值的末尾退出时。但是,不必将整个JSON加载到中间JObject
层次结构中,只需要将其重新转换为JSON字符串即可。相反,您可以使用JRaw.Create()
来获得更好的性能:
var json = JRaw.Create(reader).ToString();
在reference source中可以看到,此方法直接从传入的JsonReader
流到StringWriter
-无需加载到中间JToken
层次结构中并重新序列化-使用JsonWriter.WriteToken(JsonReader)
:
public static JRaw Create(JsonReader reader) { using (StringWriter sw = new StringWriter(CultureInfo.InvariantCulture)) using (JsonTextWriter jsonWriter = new JsonTextWriter(sw)) { jsonWriter.WriteToken(reader); return new JRaw(sw.ToString()); } }
结果JRaw
只是将该字符串封装在其Value
中。 (当然,我们不能保证所生成的JSON代表对象,仅可以保证其代表格式正确的JSON。)
(您也可以内联上述代码,并以最小的节省量消除单个中间JRaw
对象。)