>

클래스 카드와 qrCode에 두 개의 필드가 있습니다 :

public class User{
    @SerializedName("card")
    private String card;
    @SerializedName("qrCode")
    private boolean qrCode
    ...
}

이 객체를 직렬화하여 요청합니다. 그러나 백엔드에는 이러한 필드가 배포 전까지 존재하지 않습니다. 이전 값은 문자열이나 부울이 아닌 객체였습니다.

그 때문에 내 응답에서이 오류가 발생합니다 :

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected a string but was BEGIN_OBJECT at line 1

요청에서이 필드를 선택적으로 만들 수있는 방법이 있습니까?

응답은이 JSON입니다.

{"success":true,"msg":"founded","data":{..."card":{"success":false,"msg":"Not found","data":null}}}


  • 답변 # 1

    JSON object 를 변환하는 커스텀 디시리얼라이저를 구현해야합니다   String 로 :

    class ObjectOrStringJsonDeserializer implements JsonDeserializer<String> {
        @Override
        public String deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context)
            throws JsonParseException {
            if (json.isJsonPrimitive()) {
                return json.getAsJsonPrimitive().getAsString();
            }
            if (json.isJsonObject()) {
                return json.getAsJsonObject().toString();
            }
            return null;
        }
    }
    
    

    아래와 같이 사용할 수 있습니다 :

    @SerializedName("card")
    @JsonAdapter(ObjectOrStringJsonDeserializer.class)
    private String card;
    
    

    사용 예 :

    Gson gson = new GsonBuilder().create();
    String json = "{\"card\":{\"success\":false,\"msg\":\"Not found\",\"data\":null}}";
    System.out.println(gson.fromJson(json, User.class));
    
    

    인쇄 :

    User{card='{"success":false,"msg":"Not found","data":null}', qrCode=false}
    
    

    boolean qrCode 에 대해 할 수있는 것과 동일 . JSON object 를 변환하는 사용자 정의 deserialiser를 작성해야합니다   boolean 로   @JsonAdapter 를 사용하여 등록하십시오  주석.

  • 답변 # 2

    매개 변수에 문제가 없습니다. 귀하의 답변에 문제가 있습니다.

    JSONObject 를받는 데 문제가있을 수 있습니다  응답에서와 같이 해당 매개 변수를 string 로 캐스팅합니다. .

  • 이전 python - 팬더 CSV로 저장할 때 NaN 값의 형식 변경
  • 다음 r - 참조 파일을 사용하여 주 도시 이름 수정