[英]Gson: JSON to java object conversion issue if element type is dynamic
我有json字符串,並嘗試使用GSon轉換為Java Object,其中一個元素的類型是動態的。
格式1:
{"success":false,"errorMessage":"Missing all necessary request parameters.","status":400}
格式2:
{"success":false,"errorMessage":{"errors":[{"code":007,"message":"Daily quota reached maximum limit"}]},"status":400}";
嘗試實現具有“代碼”和“消息”屬性的類。 但是使用POJO一次只能處理一種情況。
如果元素對象類型是動態的(在這種情況下為字符串或對象),我還有其他方法可以處理嗎?
您必須制作自己的JsonDeserializer
:
public class ErrorMessageConverter implements JsonDeserializer<List<ErrorMessage>> {
public List<ErrorMessage> deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext ctx) {
List<ErrorMessage> vals = new ArrayList<ErrorMessage>();
if (json.isJsonPrimitive()) {
// handle your first case, for example:
ErrorMessage err = new ErrorMessage(json.getAsString());
vals.add(err);
// in this case you will have a List which contains only one element - your String-only error
} else if (json.isJsonObject()) {
// handle your second case
JsonArray errors = json.getAsJsonObject().get("errors").getAsJsonArray();
// work with errors - parse it to a List<ErrorMessage>
// you have to manually iterate over array's elements and parse it one by one to avoid an inifinit loop (if you try parsing it as a List, Gson will call your converter again)
for (JsonElement e : json.getAsJsonArray()) {
vals.add(ctx.deserialize(e, ErrorMessage.class));
}
}
return vals;
}
}
class ErrorMessage {
int code;
String message;
ErrorMessage(String message) {
this.message = message;
}
}
您的響應的POJO類應包含List<ErrorMessage> errorMessage
。
不要忘記注冊您的新轉換器:
gsonBuilder.registerTypeAdapter(new TypeToken<List<ErrorMessage>>() {}.getType(), new ErrorMessageConverter())
將此字段對象保留在POJO中 。 之后,當您想使用POJO時 ,只需執行以下if條件:
MyPojo myPojo= new MyPojo();
if( myPojo.getMyField() instanceof String ){
// do something
}
else if(myPojo.getMyField() instanceof Map<String, Object> )
{
// do something
}
或作為第二種方法,只需將json轉換為Map<String,Object>
之后就可以使用map獲取字段,當然,您必須檢查相應類型的value字段。
RG。
如果可以使用Jackson
API的,則可以使用@JsonAnyGetter
批注
@JsonAnyGetter
public Map<String, Object> getAdditionalProperties()
{
return this.additionalProperties;
}
@JsonAnySetter
public void setAdditionalProperty(String name, Object value)
{
this.additionalProperties.put(name, value);
}
這保留了未映射內容的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.