0

美好时光!

比如说,有一个 json string: {id:'a', type:'b', category:'c'},并且业务逻辑是为了构建一个类别对象,我需要知道类别名称('c')和类型('b')。显然我需要@JsonDeserialize(using = CategoryCustomDeserializer.class)为类别编写一个自定义反序列化jsonParser.getCodec().readTree(jsonParser)器( null.

请提出正确的方法。

编辑:这是反序列化器:

  public class CategoryNameDeserializer extends JsonDeserializer<Category> {

     @Override
     public Category deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        if (jp.getCurrentToken() != JsonToken.END_OBJECT) {
           String categoryName = jp.getText();
           String type = ?????? <------------------------ How to do it
           return Service.getInstance().getCategory(categoryName, type);
        }

        return null;
  }
}
4

1 回答 1

0

嗯,我找到了答案。这是一种解决方法,但它有效。可以使用以下方法重置解析器:

private JsonParser getResetParser(JsonParser jp) throws IOException {
    JsonFactory factory = jp.getCodec().getFactory();

    StringReader inputSource = (StringReader) jp.getInputSource();
    inputSource.reset();

    BufferedReader br = new BufferedReader(inputSource);
    String source = br.readLine();

    return factory.createJsonParser(source);
}

接着:

private String findTokenText(JsonParser jp, String fieldName) throws IOException {
    JsonParser parser = getResetParser(jp);
    while (true) {
        parser.nextToken();
        if (parser.hasCurrentToken()) {
            switch (parser.getCurrentToken()) {
                case END_ARRAY:
                case END_OBJECT:
                case NOT_AVAILABLE:
                case START_ARRAY:
                case START_OBJECT:
                case VALUE_EMBEDDED_OBJECT:
                case VALUE_FALSE:
                case VALUE_NUMBER_FLOAT:
                case VALUE_NUMBER_INT:
                case VALUE_TRUE:
                    // do nothing
                    break;
                case FIELD_NAME:
                    String currentName = parser.getCurrentName();
                    if (fieldName.equals(currentName)) {
                        parser.nextToken();
                        return parser.getText();
                    }
                    break;
            }
        } else {
            return null;
        }
    }

我不明白的是为什么尽管在方法内执行inputSource.reset();代码(只是在调试模式下尝试过)返回“C”,就好像阅读器没有重置一样。谁能解释一下,为什么会这样?jp.getText()findTokenText

另一个变体是避免自定义并使用这篇文章中的建议。

于 2013-03-27T08:59:46.253 回答