- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的 JSON 中,我有一个包含以下内容的元素:
{
...
"locations": [
[
{
"location_type": "permanent",
"position": "at",
"accuracy": "exact"
},
"and",
{
"location_type": "permanent",
"position": "in",
"accuracy": "exact"
}
],
"or",
{
"location_type": "temporary",
"position": "at",
"accuracy": "exact"
}
],
...
}
如图所示,locations
的元素可以是:
我收到“无法从 START_ARRAY token 中反序列化 com.example.processor.transformation.json.Location
的实例”。
如何使用 Jackson 将其消费到数据结构中?
到目前为止我尝试过的:
Location(String logicalOperator)
构造函数有助于平面列表的情况。 (我基本上将运算符转换为特殊值 Location
。)Location(List<Location> subLocations)
或Location(Location[] subLocations)
构造函数对于这种情况没有帮助。注意:我无法控制 JSON 格式,因此无法以对 Jackson 更友好的方式对其进行编码。
最佳答案
为此,您将需要一个自定义反序列化器。您不能只添加构造函数。
这是一个类 Foo
的独立示例,它可以由其自己的属性 "foo": "someString"
或某些逻辑运算符 表示>"and"
或 "or"
等作为 String
文字,旨在表示 Foo
实例,其 foo
属性将是该文字的值。
这可能完全适合您的情况,也可能不完全适合您的情况,但您可以进行调整。
换句话说:
{"foo": "a"}
--> new Foo("a")
“或”
--> new Foo(“或”)
示例
// given...
@JsonDeserialize(using=MyDeserializer.class)
class Foo {
String foo;
public void setFoo(String s) {
foo = s;
}
public String getFoo() {
return foo;
}
public Foo(String s) {
setFoo(s);
}
}
//和自定义反序列化器...
class MyDeserializer extends JsonDeserializer<Foo> {
@Override
public Foo deserialize(JsonParser jp, DeserializationContext ct)
throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
// this JSON object has a "foo" property, de-serialize
// injecting its value in Foo's constructor
if (node.has("foo")) {
return new Foo(node.get("foo").asText());
}
// other case, assuming literal (e.g. "and", "or", etc.)
// inject actual node as String value into Foo's constructor
else {
return new Foo(node.asText());
}
}
}
// here's a quick example
String json = "[{\"foo\": \"a\"}, \"or\", {\"foo\": \"b\"}]";
ObjectMapper om = new ObjectMapper();
List<Foo> list = om.readValue(json, new TypeReference<List<Foo>>(){});
list.forEach(f -> System.out.println(f.foo));
输出
a
or
b
为了清晰起见,请注意
这是一个非常简单的示例。在您的情况下,您可能需要一个 Location
POJO 与 LogicalOperator
POJO(或类似的东西)混合的多态集合,共享一个公共(public)标记接口(interface)。然后,您可以根据 JSON 节点是否包含内容(即位置)或 JSON 节点是否是其内容(例如逻辑运算符)来决定要反序列化的对象。
关于java - 使用 Jackson 将 JSON 反序列化为异构元素列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49853558/
我有一个 NSTreeController (向 NSOutlineView 提供内容)。我希望顶级对象属于一个类,而所有其他对象(因此,任何级别的子对象)属于另一个类。解决这个问题的最佳方法是什么?
我有一个如下所示的 GADT data MyTypes = MyInt | MyDouble data Test (t :: MyTypes) where A :: Int -
我需要一个高效的异构数组,其中第一个元素是 int,其余是 float。然而,创建它之后,基本的数组操作就会呈爆炸式增长。 A = np.zeros(1, dtype='i4, f4, f4') B
我有一个 pandas DataFrame,其中包含需要拆分成平衡切片的字符串和浮点列,以便训练 sklearn 管道。 理想情况下,我会使用 StratifiedKFold在 DataFrame 上
是否有一种异构容器的形式,能够存储例如不同的基本类型(例如int、float、double)? 最终我希望能够在计算中使用元素而无需显式引用类型,例如 auto res = a + b,其中操作数 a
假设我有一个结构(或类),如下所示: struct _particle { std::vector vx , vy; std::vector id; std::vector rx, ry; }; ty
我在将具有 > 22 列的表专门映射到 case class 时遇到问题,假设您有以下代码 import slick.driver.PostgresDriver import scala.slick.
我是一名优秀的程序员,十分优秀!