在JsonConverter.ReadJson()

时间:2019-07-09 01:04:55

标签: c# json.net

如何有效地在JsonConverter.ReadJson()中获取完整的json字符串?

我可以做到:

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
      var json = JObject.Load(reader).ToString(Formatting.None);

但是,由于我无缘无故地进行序列化和反序列化,这似乎效率很低

还有更好的方法吗?

1 个答案:

答案 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对象。)