【发布时间】:2018-09-10 00:24:50
【问题描述】:
我的返回结果可能如下所示:
{"rows":[{"ProfileID":"SLappE","CR_ProfileID":"BC1A"},{"ProfileID":"SCRA","CR_ProfileID":"BC15"},{"ProfileID":"SMOKE","CR_ProfileID":"BC15"},{"ProfileID":"Smokey","CR_ProfileID":"BC1F"},{"ProfileID":"WF-LN-OCR","CR_ProfileID":"BC1F"}]}
或者像这样:
{"rows":[{"PARAM":"product_reference_nr","FIELDNAME":"account_nr","EXAMPLE-FIELD":"CHK","EXAMPLE-TABLE":"CHK_DOC","ID":"CHK-ACCT"},{"PARAM":"party_pd_nr","FIELDNAME":"front_image_object_id","EXAMPLE-FIELD":"CHK","EXAMPLE-TABLE":"BACK_CHK_DOC","ID":"CHK-BACK"},{"PARAM":"endDate","FIELDNAME":"document_dt","EXAMPLE-FIELD":"HR","EXAMPLE-TABLE":"SPLAPSTIC_DOC","ID":"HR-DT"},{"PARAM":"startDate","FIELDNAME":"document_dt","EXAMPLE-FIELD":"HR","EXAMPLE-TABLE":"SPLAPSTIC_DOC","ID":"HR-DT-STARTDT"},{"PARAM":"formCode","FIELDNAME":"form_category_cd","EXAMPLE-FIELD":"HR","EXAMPLE-TABLE":"SPLAPSTIC_DOC","ID":"HR-FORM”}]}
所以我调用了一个 rest 服务,返回结果总是以 rows: 开头,然后是一个看起来是 Dictionary 或 Map/HaspMap 值的数组。该字典的大小会有所不同。但在该行列表中,它似乎是键值对。
现在我尝试将该 json 反序列化为这个数据结构:
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@JsonInclude(JsonInclude.Include.NON_NULL)
@XmlRootElement
public class EResponse {
@JsonProperty("rows")
private final List<Row> rows = new ArrayList<>();
public List<Row> getRows() {
List<Row> retResult = rows;
return retResult;
}
}
和
import com.fasterxml.jackson.annotation.*;
import javax.xml.bind.annotation.XmlRootElement;
import java.util.Hashtable;
import java.util.Map;
@JsonInclude(JsonInclude.Include.NON_NULL)
@XmlRootElement
public class Row {
private Map<String,Object> column;
@JsonProperty
public Map<String, Object> getColumn(){
return column;
}
}
我这样称呼上面的代码:
result = mapper.readValue(response.readEntity(String.class), new TypeReference<EResponse>(){});
我已经尝试了上述的各种配置,但如果不引发 Unrecognized field 异常,我似乎无法让它返回。这是有道理的,因为 Key 值中的第一个元素被视为映射器无法映射的字段,因为它没有在我映射到的对象中的任何地方定义。
将此 List> 映射到对象的适当方法是什么?有没有一种简单的方法可以将值转换为适当的类型?我正在使用 jackson-databind,但如果有一个优雅的解决方案可以解决这个问题,我可以说服他们使用 GSON。
【问题讨论】:
-
“键值中的第一个元素被视为一个字段”——您的意思是键值“行”?如果是这样,您总是可以在收到响应字符串后立即编辑它并删除前 9 个字符(和最后 2 个字符)并照常进行。我可以尝试提供一个答案,但我不确定我是否理解这个问题,或者你为什么要处理两种不同类型的回复......或者你为什么说“似乎包含”之类的话,就好像你没有设计自己回应。
-
我的意思是'ProfileID'。它定义了行就好了。如果我想获得更具体的信息并映射其余的响应,那就是当它变得棘手时。响应 JSON 来自特定供应商。每次您拨打电话时都可以使用的对象。这实际上取决于您如何设置请求。我想将此功能放入一个 jar 中,我可以将其用作 REST 服务的通用客户端
标签: java json java-8 json-deserialization jackson-databind