当前位置: 首页 > 知识库问答 >
问题:

Jackson Custom反序列化器ArrayIndexOutOfBoundsExcure

惠诚
2023-03-14

我正在尝试使用一个webservice(我没有这个功能),它用JSON为我提供一个对象数组。结果的格式有点不正确:

[
  [ #this is first object
    {
       "attribute1":"value1"
    },
    {
       "attribute2":"value2"
    }
  ],
  [ # this is second object
    {
       "attribute1":"value1"
    },
    {
       "attribute2":"value2"
    }
  ]
]

所以我尝试使用jersey客户端2.22将其反序列化为pojo。1和jackson core 2.5。4.由于基本的Jackson反序列化不起作用,我创建了一个自定义反序列化程序。

Pojo类:

 @JsonDeserialize(using = MyDeserializer.class)
 public class Pojo {
   private String attribute1;
   private String attribute2;
   *default constructor, getter and setters*
 }

MyDeserializer类:

public class MyDeserializer extends JsonDeserializer<Pojo> {
  @Override
  public Pojo deserialize(JsonParser jParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    Pojo pojoObj = new Pojo();
      while (jParser.nextToken() != JsonToken.END_ARRAY) {
        String fieldname = jParser.getCurrentName();
        if ("attribute1".equals(fieldname)) {
            jParser.nextToken();
            pojoObj.setAttribute1(jParser.getText());
        }
        if ("attribute2".equals(fieldname)) {
            jParser.nextToken();
            pojoObj.setAttribute2(jParser.getText());
        }
      }
      jParser.close();
      return pojoObj;
   }    
}

泽西/杰克逊电话:

Client client = ClientBuilder.newClient().register(JacksonJaxbJsonProvider.class);
 WebTarget webTarget = client.target("http://server/service/ressource").queryParam("param1", value);
 Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON_TYPE);
 Response response = invocationBuilder.get();
 list = Arrays.asList(response.readEntity(Pojo[].class));

但现在当我叫它时,我得到:

java.lang.ArrayIndexOutOfBoundsException: 1054
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser._skipWSOrEnd(UTF8StreamJsonParser.java:2732)
at com.fasterxml.jackson.core.json.UTF8StreamJsonParser.nextToken(UTF8StreamJsonParser.java:652)
at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:149)

这让我觉得要么是杰克逊没有用我自定义的反序列化器,要么是我错过了什么。

共有2个答案

宋丰
2023-03-14

好的,我会给你答案,因为你做了大部分的代码,解决方案是:

public Pojo deserialize(JsonParser jParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
  ObjectCodec oc = jp.getCodec();
  JsonNode node = oc.readTree(jp);
  Iterator<JsonNode> iterator = node.iterator();
  JsonNode next = iterator.next();
  String attribute1 = null
  if (next.get("attribute1") != null) {
     attribute1 = next.get("attribute1").asText();
  }
  next = iterator.next();
  String attribute2 = null
  if (next.get("attribute2") != null) {
     attribute2 = next.get("attribute2").asText();
  }
  Pojo objPojo = new Pojo(attribute1,attribute2);
  return objPojo;
}
燕超
2023-03-14

试试这个代码:

public Pojo deserialize(JsonParser jParser, DeserializationContext ctxt) throws IOException, JsonProcessingException {
    ObjectCodec oc = jp.getCodec();
    JsonNode node = oc.readTree(jp);

    Iterator<JsonNode> iterator = node.iterator();
    List<Pojo> pojos = new ArrayList<Pojo>();

    while (iterator.hasNext()) {
        JsonNode next = iterator.next();
        pojos.add(
            new Pojo(
                next.get("attribute1"),
                next.get("attribute2")));
    }

    return pojos;
}
 类似资料:
  • I'va是一个OID接口,可以由许多具体类型实现: 现在我有一个具有两个字段的对象,一个使用抽象接口类型(OID)定义,另一个使用具体类型(MyOID)定义 我想使用jackson以不同的方式序列化/反序列化字段,无论它们是使用抽象接口类型还是具体类型定义的: 注意,被序列化,包括类型信息(多态序列化),而被序列化为文本 为此,我将OID接口注释为: 并为每个具体类型分配了类型id: 最后,对容器

  • 我想反序列化表单中的类: 其中文本是加密的,反序列化应该在重建TestFieldEncryptedMessage实例之前取消对值的加密。 我采用的方法非常类似于:https://github.com/codesqueak/jackson-json-crypto 也就是说,我正在构建一个扩展SimpleModule的模块: 如您所见,设置了两个修饰符:EncryptedSerializerModif

  • 问题内容: 我正在使用JAVA 1.6和Jackson 1.9.9我有一个枚举 我添加了一个@JsonValue,这似乎可以将对象序列化为: 但是当我尝试反序列化时,我得到了 我在这里想念什么? 问题答案: 如果你希望将枚举类与其JSON表示完全脱钩,则@xbakesx指出的序列化器/反序列化器解决方案是一个很好的解决方案。 另外,如果你喜欢一个独立的解决方案,则基于·和·注释的实现会更方便。 因

  • 我正在尝试使用RestTemplate使用REST服务。我无法反序列化JSON响应。我正在使用一个自定义反序列化程序,我的JSON有3个节点,但看起来只有一个节点到达反序列化程序。以下是更多详细信息。 以下是JSON的响应: 我正在使用@jsondeselizer对属性Hello的响应类使用自定义反序列化器。 当我执行如下readTree时: 它到达了反序列化方法,看起来它只有一个节点,而不是下面