小编Hum*_*jät的帖子

JSON Jackson - 使用自定义序列化程序序列化多态类时的异常

我目前正在将一些代码从Jackson 1.x迁移到Jackson 2.5 json mapper,这是一个长期存在的问题,在1.x中没有.

这是设置(见下面的代码):

  • 接口IPet
  • class Dog实现了IPet
  • IPet使用@JsonTypeInfo和@JsonSubTypes进行注释
  • class Human有一个IPet类型的属性,用@JsonSerialize注释(using = CustomPetSerializer.class)

问题: 如果我序列化Dog的一个实例,它按预期工作(杰克逊也将类型信息添加到json字符串).但是当我序列化Human类的一个实例时,会抛出一个异常:

com.fasterxml.jackson.databind.JsonMappingException:未为类型com.pet.Dog实现的类型id处理(通过引用链:com.Human ["pet"])

CustomPetSerializer类的serialize(...)方法未被调用(使用断点测试).

代码:

IPet实现:

@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.PROPERTY, property="type")
@JsonSubTypes({
     @JsonSubTypes.Type(value=Dog.class,    name="dog")
    //,@JsonSubTypes.Type(value=Cat.class,  name="cat")
    //more subtypes here...
})
public interface IPet
{
    public Long getId();
    public String getPetMakes();
}
Run Code Online (Sandbox Code Playgroud)

狗实施:

public class Dog implements IPet
{
    @Override
    public String getPetMakes()
    {
        return "Wuff!";
    }

    @Override
    public Long getId()
    {
        return 777L;
    }
}
Run Code Online (Sandbox Code Playgroud)

拥有狗的人:

public class Human
{
    private IPet pet = new Dog();

    @JsonSerialize(using=CustomPetSerializer.class) …
Run Code Online (Sandbox Code Playgroud)

java json jackson

14
推荐指数
2
解决办法
1万
查看次数

MongoDB多维数组投影

我刚开始学习MongoDB,无法找到解决问题的方法.

得到那个文件:

> db.test.insert({"name" : "Anika", "arr" : [ [11, 22],[33,44] ] })
Run Code Online (Sandbox Code Playgroud)

请注意"arr"字段是一个多维数组.

现在我正在寻找一个只返回arr [0] [1]值22的查询.我试图通过使用$ slice来实现它,但是我不知道如何使用它来解决第二个维度.

> db.test.find({},{_id:0,"arr":{$slice: [0,1]}})
{ "name" : "ha", "arr" : [ [ 11, 22 ] ] }
Run Code Online (Sandbox Code Playgroud)

我也试过了

> db.test.find({},{_id:0,"arr":{$slice: [0,1][1,1]}})
{ "name" : "ha", "arr" : [ [ 11, 22 ] ] }
Run Code Online (Sandbox Code Playgroud)

期望的输出也是

22
Run Code Online (Sandbox Code Playgroud)

要么

{"arr":[[22]]}
Run Code Online (Sandbox Code Playgroud)

谢谢


编辑:

阅读评论后,我认为我已经过多地简化了示例数据,我必须提供更多信息:

  1. 该集合中有更多文档,就像我提供的文档一样.但它们都具有相同的结构.
  2. 有两个以上的数组元素
  3. 在现实世界中,数组包含非常长的文本(500kb-1mb),因此将整个数据传输到客户端非常容易.
  4. 在聚合之前,我将通过'name'字段进行查询.为了简单起见,在示例中跳过了它.
  5. 目标索引是可变的,所以有时我需要知道arr [0] [1]的值,下次是arr [1] [4]

示例数据:

> db.test.insert({"name" : "Olivia", "arr" : [ [11, 22, 33, 44],[55,66,77,88],[99] ] …
Run Code Online (Sandbox Code Playgroud)

multidimensional-array mongodb aggregation-framework

5
推荐指数
1
解决办法
4152
查看次数