我写了一个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;
带着一堆吸气剂和二传手。
它适用于除numericKeyValue
和textKeyValue
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; ;一个空字符串,但仍然无法帮助我。
非常感谢任何帮助或建议。
答案 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
}
}