- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用JAX-RS(带有RESTEasy)和最新版本的Jackson来编组JSON中的对象。例如,我仅将返回内容类型指定为application/json
,然后将我的对象转换为JSON。我可以使用Jackson注释来调整哪些属性被序列化,如何命名等。
我有一个基于文本的自定义Foo格式text/foo
(出于讨论的目的),它类似于JSON但有所不同,尤其是在对象和属性定界的方式中。我希望能够将text/foo
指定为返回内容类型,并使我的对象自动序列化为Foo格式。我希望我的封送处理库独立于JAX-RS实现。
我的第一个想法是以某种方式利用Jackson,以便我可以利用Jackson的属性名称注释等。这样,如果我将内容类型更改为text/foo
,则使用Jackson为JSON配置的某些对象将是序列化为Foo格式,但仍使用Jackson批注指示的属性名称。
Jackson变得非常复杂,具有各种API,并且从哪里开始并不明显。
是否可以利用Jackson将对象序列化为非JSON格式?
我应该使用哪个Jackson API(树模型,流API或数据绑定)?
是否有一些现有的非JSON Jackson库可以作为示例来帮助我入门?
以这种方式使用Jackson只会带来更多麻烦,而我应该只编写JAX-RS MessageBodyReader
和MessageBodyWriter
实现,而完全跳过Jackson吗? (我犹豫要走这条路,因为我必须从头开始编写所有反射逻辑,编写我自己的注释以指定属性名称更改等,并放弃所有Jackson的类型插件基础结构。)
最佳答案
Jackson API的优势
是可用于处理JSON文件的最快的库之一。
具有更广泛的注释支持,甚至可以接受来自其他API(例如JAXB)的注释。
与JAX-RS有更好的集成。
流式(核心)
这是杰克逊(Jackson)的核心,是解析器/序列化器停留的地方,用于处理输入/输出数据的流。
这是可用于解析/序列化数据的最快方法。
这不是处理JSON内容的最便捷方法。
必须以与输入/输出完全相同的顺序处理内容,即不能随机访问。
中间件和框架使用更多,但对于应用程序不是很常见。
这是必须具有完整功能版本的Jackson的API,该版本支持所需的数据格式。它也是由其他数据格式(例如XML,Java属性,YAML等)实现的唯一API。
实现此API后,将自动支持DataBinding和TreeModel。
GSON也与Jackson一起进行了研究,但由于与Jackson相似且缺乏性能,因此Jackson是本报告的主要主题。
性能的差异是由于这些API处理数据的方式所致,Jackson首先使用流,这是一种快速的低级方法,它使Jackson成为启动时处理JSON的最快API。
尽管GSON也已开始使用这种方法来处理数据,但是根据基准测试(根据参考资料部分中的基准测试),杰克逊仍然是最快的API。
树模型
这是api的一部分,它提供了JSON文档的可变内存中树表示形式。
使用某些类似于XML的数据格式时,该API是最灵活的。
数据绑定
这是api的一部分,它基于属性访问器约定或注释将JSON与POJO相互转换。
处理JSON内容的最便捷方法。
它允许在JSON数据和JAVA对象之间进行转换。
与TreeModel相似,但是使用Java对象而不是基于节点的模型。
就应用程序而言,此API是最常用的
有关Jackson流实现的说明
由于这是我们唯一需要实现的API,因此我们将对此予以更多关注。
Streaming API的实现使用所谓的JsonToken
来标识即将出现在流中的JSON对象,即输入/输出数据。JsonToken
枚举具有以下定义:
NOT_AVAILABLE(null),
START_OBJECT("{"),
END_OBJECT("}"),
START_ARRAY("["),
END_ARRAY("]"),
FIELD_NAME(null),
VALUE_STRING(null),
VALUE_NUMBER_INT(null),
VALUE_NUMBER_FLOAT(null),
VALUE_TRUE("true"),
VALUE_FALSE("false"),
VALUE_NULL("null")
ReadContext
的方式检索这些令牌。
ReadContext
具有一些常量来定义其自己的类型。
JsonStreamContext
类型的常量。
protected final static int TYPE_ROOT = 0; // Means the root element.
protected final static int TYPE_ARRAY = 1; // Means the array elements.
protected final static int TYPE_OBJECT = 2; // Means the JSON object elements.
JPropReadContext extends JsonStreamContext {
// Static factory method used to create the JPropReadContext instance.
public static JPropReadContext create(JPropNode root) {
if (root.isArray()) { // can this ever occur?
return new ArrayContext(null, root);
}
return new ObjectContext(null, root);
}
…
ArrayContext extends JPropReadContext {
// Constructor for ArrayContext.
public ArrayContext(JPropReadContext p, JPropNode arrayNode) {
super(JsonStreamContext.TYPE_ARRAY, p, arrayNode);
_contents = arrayNode.arrayContents();
_state = STATE_START;
}
…
}
…
ObjectContext extends JPropReadContext {
// Constructor for ObjectContext.
public ObjectContext(JPropReadContext p, JPropNode objectNode) {
super(JsonStreamContext.TYPE_OBJECT, p, objectNode);
_contents = objectNode.objectContents();
_state = STATE_START;
}
…
}
…
}
JPropReadContext
仅扩展了
JsonStreamContext
,因此它需要从
JsonStreamContext
传递常量,以指示上下文的类型(如果它是根,数组或对象)。该常数只是一个简单的int值,因此在那之前没有问题。
…
// Static factory method used to create the XmlReadContext instance of type ROOT.
public static XmlReadContext createRootContext(int lineNr, int colNr) {
return new XmlReadContext(null, TYPE_ROOT, lineNr, colNr);
}
// Static factory method used to create the XmlReadContext instance of type ARRAY.
public final XmlReadContext createChildArrayContext(int lineNr, int colNr) {
XmlReadContext ctxt = _child;
if (ctxt == null) {
_child = ctxt = new XmlReadContext(this, TYPE_ARRAY, lineNr, colNr);
return ctxt;
}
ctxt.reset(TYPE_ARRAY, lineNr, colNr);
return ctxt;
}
// Static factory method used to create the XmlReadContext instance of type OBJECT.
public final XmlReadContext createChildObjectContext(int lineNr, int colNr) {
XmlReadContext ctxt = _child;
if (ctxt == null) {
_child = ctxt = new XmlReadContext(this, TYPE_OBJECT, lineNr, colNr);
return ctxt;
}
ctxt.reset(TYPE_OBJECT, lineNr, colNr);
return ctxt;
}
…
JsonToken
,就好像它们的格式是Json实例一样,换句话说,它伪造了自己的格式,使其看起来像Jackson的Json实例。这不是一个干净的方法。例如,他们可以使用
TYPE_OBJECT
来表示类似
<element>value<element>
或
property = "string containing the value of the property."
的内容。
关于java - 对Jackson使用非JSON格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242789/
最近开始学习MongoDB。今天老师教了我们 mongoexport 命令。在练习时,我遇到了一个典型的问题,包括教练在内的其他同学都没有遇到过。我在我的 Windows 10 机器上使用 Mongo
我是 JSON Schema 的新手,读过什么是 JSON Schema 等等。但我不知道如何将 JSON Schema 链接到 JSON 以针对该 JSON Schema 进行验证。谁能解释一下?
在 xml 中,我可以在另一个 xml 文件中包含一个文件并使用它。如果您的软件从 xml 获取配置文件但没有任何方法来分离配置,如 apache/ngnix(nginx.conf - site-av
我有一个 JSON 对象,其中包含一个本身是 JSON 对象的字符串。我如何反序列化它? 我希望能够做类似的事情: #[derive(Deserialize)] struct B { c: S
考虑以下 JSON { "a": "{\"b\": 12, \"c\": \"test\"}" } 我想定义一个泛型读取 Reads[Outer[T]]对于这种序列化的 Json import
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 11 个月前关闭。 Improve
我的旧项目在 MySQL 中有 Standard JSON 格式的数据。 对于我在 JS (Node.js) 和 DynamoDB 中的全新项目,关于 Standard JSON格式: 是否建议将其转
JSON 值字符串、数字、true、false、null 是否是有效的 JSON? 即,是 true 一个有效的 JSON 文档?还是必须是数组/对象? 一些验证器接受这个(例如 http://jso
我有一个 JSON 字符串,其中一个字段是文本字段。这个文本字段可以包含用户在 UI 中输入的文本,如果他们输入的文本是 JSON 文本,也许是为了说明一些编码,我需要对他们的文本进行编码,以便它不会
我正在通过 IBM MQ 调用处理数据,当由 ColdFusion 10 (10,0,11,285437) 序列化时,0 将作为 +0.0 返回,它会导致无效的 JSON并且无法反序列化。 stPol
我正在从三个数组中生成一个散列,然后尝试构建一个 json。我通过 json object has array 成功了。 require 'json' A = [['A1', 'A2', 'A3'],
我从 API 接收 JSON,响应可以是 30 种类型之一。每种类型都有一组唯一的字段,但所有响应都有一个字段 type 说明它是哪种类型。 我的方法是使用serde .我为每种响应类型创建一个结构并
我正在下载一个 JSON 文件,我已将其检查为带有“https://jsonlint.com”的有效 JSON 到文档目录。然后我打开文件并再次检查,结果显示为无效的 JSON。这怎么可能????这是
我正在尝试根据从 API 接收到的数据动态创建一个 JSON 对象。 收到的示例数据:将数据解码到下面给出的 CiItems 结构中 { "class_name": "test", "
我想从字符串转换为对象。 来自 {"key1": "{\n \"key2\": \"value2\",\n \"key3\": {\n \"key4\": \"value4\"\n }\n
目前我正在使用以下代码将嵌套的 json 转换为扁平化的 json: import ( "fmt" "github.com/nytlabs/gojsonexplode" ) func
我有一个使用来自第三方 API 的数据的应用程序。我需要将 json 解码为一个结构,这需要该结构具有“传入”json 字段的 json 标签。传出的 json 字段具有不同的命名约定,因此我需要不同
我想使用 JSON 架构来验证某些值。我有两个对象,称它们为 trackedItems 和 trackedItemGroups。 trackedItemGroups 是组名称和 trackedItem
考虑以下案例类模式, case class Y (a: String, b: String) case class X (dummy: String, b: Y) 字段b是可选的,我的一些数据集没有字
我正在存储 cat ~/path/to/file/blah | 的输出jq tojson 在一个变量中,稍后在带有 JSON 内容的 curl POST 中使用。它运作良好,但它删除了所有换行符。我知
我是一名优秀的程序员,十分优秀!