为什么jsonParser.getCodec()。readTree(jsonParser).asText()为我返回一个空字符串?

时间:2016-02-03 17:14:50

标签: java json spring rest post

我写了一个REST服务来从帖子请求中提取元数据。我正在使用spring-data-elasticsearch,我制作了一个自定义元数据对象来将Json反序列化为如下所示:

@Document(indexName = "metadata_v1", type = "metadata")
    public class Metadata {
    @Id
    private String id;
    @Field(type = FieldType.String)
    private String uuid;
    @Field(type = FieldType.String)
    private String userId;
    @Field(type = FieldType.Date, format = DateFormat.basic_date_time)
    private Date date = null;
    @Field(type = FieldType.String)
    private String classification;
    @Field(type = FieldType.Nested)
    private List<NumericKeyValue> numericKeyValue;
    @Field(type = FieldType.Nested)
    private List<TextKeyValue> textKeyValue;

带着一堆吸气剂和二传手。

它适用于除numericKeyValuetextKeyValue Json Arrays之外的所有字段。我无法通过post post请求发送这些内容,并意识到我需要编写一个反序列化器。我为numericKeyValue做了这件事,据我所知,它应该是这样的:

public class NumericKeyValueJsonDeserializer extends JsonDeserializer<List<NumericKeyValue>>{

    @Override
    public List<NumericKeyValue> deserialize(JsonParser jp, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        TypeReference<List<NumericKeyValue>> typeRef = new TypeReference<List<NumericKeyValue>>(){};
        ObjectMapper mapper = new ObjectMapper();
        JsonNode root = jp.getCodec().readTree(jp);
        String numericKeyValue = root.get("numericKeyValue").asText();
        return mapper.readValue( numericKeyValue, typeRef);
    }

}

我添加了

@JsonDeserialize(using = NumericKeyValueJsonDeserializer.class)

到我的元数据类中的字段声明。

然而,在经过大量测试后,我逐渐意识到JsonNode root不仅不包含"numericKeyValue",而且在我调用{{{}}时给了我一个完全空的字符串。 1}}。

我一直在使用Postman向我的终端发送帖子请求

root.asText()

包含以下Json:

@RequestMapping(value="/metadata_v1/ingest", method=RequestMethod.POST, consumes="application/json")
public @ResponseBody Metadata createEntry(@RequestBody Metadata entry){
    repository.save(entry);
    return entry;
}

我的映射如下所示:

{
    "numericKeyValue": 
    [
      {
        "key": "velocity",
        "value": 55.5
      },
      {
        "key": "angle",
        "value": 90
      }
    ]
}

如果需要,我可以展示更多东西。如果我能以某种方式获得用Java发送的JSON,我想我会没事的,也许是作为String。我已经得到空字符串,导致空指针异常,当我尝试"numericKeyValue" : { "type" : "nested", "properties" : { "key" : {"type" : "string"}, "value" : {"type" : "double"} } } 时,字符串只是&#34; [&#34;的当前标记,我认为至少不是&#39; ;一个空字符串,但仍然无法帮助我。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:1)

在您的情况下,numericKeyValue的值是一个数组。您应该替换以下行:

String numericKeyValue = root.get("numericKeyValue").asText();

使用:

if ( root.isArray() ){
    // loop trough array
    for (final JsonNode node : root){
       String numericKeyValue = node.get("numericKeyValue").asText();
       // then build the list to be returned
    }
}