问题标签 [jackson-databind]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 在 Jackson 的 JsonDeserializer 中获取检测到的泛型类型
由于外部原因,Map
我系统中的所有 java 只能作为键值对列表Map<String, Book>
从客户端接收,例如 a实际上将作为 Json-serialized 接收List<MapEntry<String, Book>>
。这意味着我需要自定义我的 Json 反序列化过程以期望这种地图表示。
问题是JsonDeserializer
让我实施
无法访问它应该反序列化的检测到的泛型类型的方法(Map<String, Book>
在上面的示例中)。如果没有这些信息,我就无法在List<MapEntry<String, Book>>
不失去类型安全性的情况下反序列化。
我在看转换器,但它提供的上下文更少。
例如
但这可能会创建危险的地图,ClassCastException
在检索时会抛出异常,因为无法检查类型实际上是否合理。有没有办法解决这个问题?
作为我所期望的一个例子,GsonJsonDeserializer
看起来像这样:
即它以一种理智的方式提供对预期类型的访问。
java - 尽管架构配置,Jackson CsvMapper 无法正确反序列化为 POJO
出于某种原因,尽管配置了 FasterXML Jackson CSV 映射器来创建基于 POJO 的模式,但它坚持认为没有提供合适的配置。我得到以下异常:
我的 POJO 很简单
我的解析代码是
我以这种方式处理 MultipartFile 而不是直接读取流的原因是消除了文件和映射器之间不匹配行分隔符的问题(我在 Windows 上工作 [不要对我投反对票 :(],而映射器的默认行分隔符仅\n
.
数据文件是这个
名字,姓氏,年龄
"保罗","史密斯","22"
《简》、《粗鲁》、《98》
我尝试添加和删除引号(默认字符串分隔符)。我尝试不使用年龄数字引号,然后出于绝望添加了它们。没有欢乐!
我查看了其他 SO 问题以及博客文章的文档。没运气。
java - Jackson注册自定义json序列化器
这是我的自定义 JSON 序列化器,我正在尝试将其注册为模块。这是我到目前为止所拥有的。
这是我创建的模块类(似乎无法添加序列化程序)。
这是它使用的对象映射器的方式(这有效)
java - Jackson 将对象列表反序列化为地图
我有自己的自定义反序列化器
认为这不起作用,因为Car
它是一个基类,并且地图应该有地图字符串,汽车的子类)
输入 JSON = [{"name": "honda", "type": "Regular , "speed": 60}]
这应该在地图中,例如Map.put("honda", RegularCar.class)
java - 在 Java 中解析 Yaml
我有以下YAML
我想Jackson
在 Java 中使用解析器解析的内容。
我创建了一个 created ,class
它具有getter
和setter
as Java Object
。android
它工作正常。但是我如何为6.0
和7.0? I'm using
杰克逊的解析器做同样的事情
java - Jackson,将纯 JSON 数组反序列化为单个 Java 对象
一个外部服务正在提供一个带有普通/原始元素的 JSON 数组(因此没有字段名称,也没有嵌套的 JSON 对象)。例如:
我想使用 Jackson 将其转换为以下 Java 类的实例:
(如果需要,可以调整此类。)
问题:是否可以使用类似的方法将此 JSON 反序列化为 Java?
或者这只能通过为这个 Person 类编写一个自定义的 Jackson 反序列化器来实现?
我确实尝试了以下方法,但没有奏效:
结果:Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: Argument #0 of constructor [constructor for Person, annotations: {interface com.fasterxml.jackson.annotation.JsonCreator=@com.fasterxml.jackson.annotation.JsonCreator(mode=DEFAULT)}] has no property name annotation; must have name when multiple-parameter constructor annotated as Creator
at [Source: (String)"["Foo", "Bar", 30]"; line: 1, column: 1]
java - 杰克逊,反序列化具有私有字段的类和没有注释的 arg-constructor
可以使用 Jackson? 反序列化为具有私有字段和自定义参数构造函数的类,而无需使用注释和修改类
我知道在杰克逊中使用这种组合是可能的:1)Java 8,2)使用“-parameters”选项编译,3)参数名称与 JSON 匹配。但是在没有所有这些限制的情况下,默认情况下在 GSON 中也是可能的。
例如:
这适用于 GSON,但杰克逊抛出:
这在 GSON 中是可能的,所以我希望 Jackson 中必须有某种方法,而无需修改 Person 类、没有 Java 8,也没有显式的自定义反序列化器。有人知道解决方案吗?
- 更新,附加信息
Gson 似乎跳过了参数构造函数,因此它必须在幕后使用反射创建一个无参数构造函数。
此外,即使没有“-parameters”编译器标志,也有一个Kotlin Jackson 模块能够为 Kotlin 数据类执行此操作。所以奇怪的是,Java Jackson 似乎不存在这样的解决方案。
这是 Kotlin Jackson 中可用的(漂亮而干净的)解决方案(IMO 也应该通过自定义模块在 Java Jackson 中可用):
java - 由于 lombok 创建的非默认构造函数,Jackson 反序列化失败
Jackson 可以在 2.6.5 中为以下类反序列化 json,但在 2.8.8 中失败。
模型:
JSON:
例外是:
我发现由 lombok 创建的 Child 构造函数导致了这个错误。当我摆脱 lombok 注释或手动创建构造函数时,这种情况就不会发生了。无论哪种方式,它都应该使用无参数 Child() 构造函数。是什么导致了这个问题?
java - 杰克逊 ObjectCodec 到字符串 json
使用杰克逊,我如何安全地将 JsonNode 转换为 JSON 字符串。
可以这样做,ObjectMapper#writeValueAsString
并且我知道在正常情况下ObjectCode
可以强制转换为ObjectMapper
,但似乎不是很干净。
也可以这样做payload.toString()
,但文档指出:
将生成节点的开发人员可读表示的方法;这可能是也可能不是有效的 JSON。如果您想要有效的 JSON 输出(或使用 Jackson 支持的其他数据格式之一格式化输出),请确保使用 {@link ObjectMapper} 或 {@link ObjectWriter} 来序列化实例,例如: String json = objectMapper.writeValueAsString(rootNode );
所以这也不安全。
我看到的最后一种可能性是构建一个新的ObjectMapper
,但对我来说似乎不是很有效。
jackson - Jackson - InvalidFormatException 反序列化 ENUM
我正在尝试使用其中包含一组枚举属性的 jackson-databind Objectmapper 反序列化 JSON 字符串。当枚举中未定义的未知属性进入 JSON 时,就会发生这种情况。请在下面找到我正在使用的对象映射器配置。
但是,反序列化 (objectMapper.readValue(jsonText, .class);) 会引发此错误。“测试”是 JSON 字符串中要反序列化的未知属性。
com.fasterxml.jackson.databind.exc.InvalidFormatException:无法com..*
从字符串“Test”反序列化类型的映射键:不是有效的表示,问题:(com.fasterxml.jackson.databind.exc.InvalidFormatException)无法反序列化类型的映射键com....
来自字符串“Test”:不是枚举类除外的值之一:[]
有人可以帮我解决这个问题吗?
谢谢!