- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个特定类的反序列化器,它在读取字段时需要一些排序。假设我的类中有两个字段(field1
和 field2
),为了读取 field2
,它首先需要 field1
.
例如,对于以下 json 数据,它可以工作,因为当反序列化器解析 field2
时,field1
已经设置:
{"field1": 3, "field2": 4}
但是如果我们反转字段:
{"field2": 4, "field1": 3}
我需要通过 jp.skipChildren
跳过 field2
因为 field1
没有设置。当field1
被解析后,Jackson应该重新读取并解析field2
。
一个选项是解析 field2 而不是跳过并将其保存在一个变量中,这样当设置 field1 时,它可以使用保存 field2 中数据的变量。然而;根据 field1
的值,我可能不需要解析 field2
,因此我正在寻找更好的解决方案,因为这部分代码的性能至关重要。
我正在使用 Mapper.readValue(byte[], MyClass.class)
方法,Jackson 似乎使用 ReaderBasedJsonParser
进行解析。尽管可以获取 token 位置,但我找不到设置 token 位置的方法。
最佳答案
终于找到方法了。这实际上是一种解决方法,但它通过了我编写的测试。当您将字节数组传递给 mapper.readValue 时,它使用 ReaderBasedJsonParser
遍历数组并解析 JSON 树。
public static class SaveableReaderBasedJsonParser extends ReaderBasedJsonParser {
private int savedInputPtr = -1;
public SaveableReaderBasedJsonParser(IOContext ctxt, int features, Reader r, ObjectCodec codec, CharsToNameCanonicalizer st, char[] inputBuffer, int start, int end, boolean bufferRecyclable) {
super(ctxt, features, r, codec, st, inputBuffer, start, end, bufferRecyclable);
}
public void save() {
savedInputPtr = _inputPtr;
}
public boolean isSaved() {
return savedInputPtr>-1;
}
public void load() {
_currToken = JsonToken.START_OBJECT;
_inputPtr = savedInputPtr;
_parsingContext = _parsingContext.createChildObjectContext(0, 0);
}
}
当您使用此 JsonParser
时,将传递给反序列化器 EventDeserializer.deserialize(JsonParser, DeserializationContext) 的 JsonParser
实例将是一个 SaveableReaderBasedJsonParser
这样你就可以安全地转换它了。
当你想保存位置时,调用jp.save()
这样当你需要返回时,你可以直接调用jp.load()
.
正如我所说,这实际上是一种变通方法,但是当您需要这种功能并且不想出于性能原因对树进行两次解析时,您可以尝试一下。
关于java - 在 Jackson Custom Deserializer 中读取跳过的 child ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28467776/
我的应用使用 Jackson。我得到的最小化构建主要使用此配置: # don't obfuscate Jackson classes -keep class com.fasterxml.** { *;
编辑:在我问这个问题的那一刻,我想到了尝试一些事情..我已经根据请求设置了 XmlNamespace 属性,这就成功了.. request.XmlNamespace = "http://musicbr
我使用可序列化和可反序列化的泛型。但是,Deserialize上有错误派生属性告诉无法推断类型。 struct 和 enum 都会抛出编译错误。评论其中之一不会解决任何问题。 use serde::{
passport.socketio 抛出此错误,同时无法授权用户。 Error: Error: Failed to deserialize user out of session 我已将问题范围缩小到
我正在尝试在具有借用内容的结构上派生反序列化: #[macro_use] extern crate serde_derive; use std::net::SocketAddr; #[derive(H
我执行查询以创建下面的Hive表: CREATE TABLE db1.test_create_tbl( column1 smallint COMMENT 'desc of column') COMME
这个问题在这里已经有了答案: Can System.Text.Json.JsonSerializer serialize collections on a read-only property? (
我正在使用 event_emmiter_rs用于我的应用程序中的事件处理。该库允许您订阅带有回调的事件并触发这些事件。事件采用 (strings, value) 的形式,回调采用接受值参数的闭包形式。
我收到一个错误...(不存在像默认构造函数这样的创建者):无法从对象值反序列化(没有基于委托(delegate)或基于属性的创建者),这表明我需要一个属性基于的创作者。我有几个具有不同参数但没有默认值
我相信我们需要一个自定义的反序列化器来对我们类的一个字段做一些特定的事情。看来一旦我这样做了,我现在负责反序列化所有其他领域。有没有办法让 jackson 反序列化除了我在这里关心的领域之外的所有领域
我有一个如下所示的类(class) class Person { Long id; String firstName; int age; } 我的输入看起来像这样: { "id
文档建议 NancyFx 帮助我解决 json 请求正文的 WRT 反序列化,但我不确定如何。请参阅下面的测试以演示: [TestFixture] public class ScratchNancy
考虑代码... using System; using System.Text.Json; public class Program { public static void Main()
有人让Deserializer工作吗?我正在方法“反序列化”而不是元素中获得完整的JSON表达式? public static void main(String[] args) { G
在尝试从 tokio TcpStream 反序列化为 JSON Value 时,我正在尝试使用此函数: use futures::prelude::*; use serde_json::Value;
我使用 Spring Boot 和 thymeleaf我尝试保存对象列表。 我的对象。 public class GECPD { public Integer id; public S
我正在尝试制作在线领唱。我需要从外部API获取包含货币值的表,正是从该页面:http://api.nbp.pl/api/exchangerates/tables/A?format=json我想在货币课
错误: java.lang.ClassNotFoundException: testprocedure.tp$3 at java.net.URLClassLoader$1.run(Unknown So
我开发了多个 GWT Web 应用程序。最新的一个是对另一个的稍微修改。除了最新的之外,所有这些都运行良好。异常(exception)是: The response could not be dese
我需要反序列化 1.5GB txt 文件。我正在使用 code.google.com/p/protobuf-net/中的 protobuf-net 有时它会因不同地方的不同异常(空引用、内存访问冲突)
我是一名优秀的程序员,十分优秀!