簡體   English   中英

Gson:如果元素類型為動態,則JSON到Java對象的轉換問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM