- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何在 JsonConverter.ReadJson()
中高效获取完整的 json 字符串?
我能做到:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {
var json = JObject.Load(reader).ToString(Formatting.None);
然而,这似乎非常低效,因为我无缘无故地序列化和反序列化
有什么更好的方法吗?
最佳答案
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。)
请注意,JsonTextReader
会自动将 common formats 中的日期和时间识别并解析为 DateTime
对象,并将浮点值解析为 double
。如果您需要“最直接”的 JSON 字符串,您可能希望抑制 DateTime
识别和/或将浮点值解析为 decimal
。以下扩展方法以 JRaw.Create()
为模型,可以完成这项工作:
public static string ReadOuterJson(this JsonReader reader, Formatting formatting = Formatting.None, DateParseHandling? dateParseHandling = null, FloatParseHandling? floatParseHandling = null)
{
// If you would prefer a null JSON value to return an empty string, remove this line:
if (reader.TokenType == JsonToken.Null)
return null;
var oldDateParseHandling = reader.DateParseHandling;
var oldFloatParseHandling = reader.FloatParseHandling;
try
{
if (dateParseHandling != null)
reader.DateParseHandling = dateParseHandling.Value;
if (floatParseHandling != null)
reader.FloatParseHandling = floatParseHandling.Value;
using (var sw = new StringWriter(CultureInfo.InvariantCulture))
using (var jsonWriter = new JsonTextWriter(sw) { Formatting = formatting })
{
jsonWriter.WriteToken(reader);
return sw.ToString();
}
}
finally
{
reader.DateParseHandling = oldDateParseHandling;
reader.FloatParseHandling = oldFloatParseHandling;
}
}
然后像这样调用它,例如:
var json = reader.ReadOuterJson(dateParseHandling: DateParseHandling.None);
有关为什么需要这样做的详细信息,请参阅:
关于c# - 在 JsonConverter.ReadJson() 中有效地获取完整的 json 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56944160/
我想要实现的目标。我有一个类,其中有一些属性/对象。我只想用我的自定义序列化程序序列化那些满足 CanConvert 条件的对象,其他对象应该默认处理。 问题是使用 [JsonConverter(ty
我无法使用 readJSON 从 JSON 读取所有键“type-X.X” oldJson 字符串: { "branch":{ "type-0.2":{"version":"0.2","rc"
我正在尝试为对象[] 创建一个 json 转换器来定义我想要的类型(例如 int32 而不是 int64)。 这是我到现在为止得到的: 对象: [JsonObject] public class ti
我想将参数传递给我的 Gruntfile.js,以便 grunt.file.readJSON 可以读取传入的文件名。我应该怎么办? grunt.initConfig({ filename:
我正在尝试为结构实现自定义 JsonConverter,但我很难让它工作。我之前为另一个类实现了一个自定义转换器并且那个工作完美,我以为我为这个做了同样的事情但是我的转换器的 ReadJson 方法从
我遇到了最奇怪的问题,希望其他人已经看到了这个问题,甚至可能已经解决了。 以前,我在 grunt.js 文件中有一组参数,用于我的 Protractor 测试。下面的简单示例: params: {
这是我的自定义 json 转换器的一部分: public class ExpandoConverter : JsonConverter { public override bool CanC
def data = readJSON text: '{"rel" : {"configVersion": "1.0","manifest" :"'+"${manifestURL}"+'"}}' wr
我正在努力设置一系列与 RequireJS r.js 编译器一起使用的 grunt 任务:1) 生成一个 .json 文件,列出目录中的所有文件2)从文件名中删除“.js”(requirejs需要这个
我有一个 Newtonsoft JSON.NET JsonConverter 来帮助反序列化类型为抽象类的属性。它的要点是这样的: public class PetConverter : JsonCo
如何在 JsonConverter.ReadJson() 中高效获取完整的 json 字符串? 我能做到: public override object ReadJson(JsonReader rea
创建自定义 Json 转换器时,需要重写的方法之一是: public override object ReadJson(JsonReader reader, Type objectType, obje
我正在将 Grunt 文件转换为 Gulp 文件。我的 Grunt 文件包含以下行 var config = grunt.file.readJSON('json/config.json'); 这一行所
先决条件: JSON.Net 11.0.2 我需要通过基于 JSON 的 REST-API 存储 UTC DateTime 往返日期/时间模式。 string utcTimestamp = DateT
我有一个 JSON 输入,其对象全部派生自基类,如下所示: public abstract class Base { public Base Parent { get; set; } } 我正
我已经创建了 JsonConverter 的实现 CanConvert 始终返回 true。 在 ReadJson 中,我有时只想使用“默认”行为,就好像 CanConvert 返回了 false 而
我正在尝试为 NetTopologySuite 几何编写自定义 JsonConverter。 我的模型: public class MyModel { public string myName
我是一名优秀的程序员,十分优秀!