Проверка ключа JSON Java - PullRequest
       7

Проверка ключа JSON Java

0 голосов
/ 07 октября 2019

Я работаю с Json и Gson. Я преобразовал данные JSON в GSON, а также проверенные ключи. это работает отлично. Но это не проверка дочерних ключей.

[
      {
        "version": 1,
        "location_code": "oa01",
        "location_floor": 20,
        "floorplan_coords": [
          {"id": 0, "coords":[0,0]},
          {"id": 1, "coords":[0,50]},
          {"id": 2, "coords":[235,50]},
          {"id": 3, "coords":[235,0]}
        ]
      }
    ]

В приведенном выше примере ключи с именем version, location_code, location_floor, floorplan_coords успешно проверены. Но дочерние ключи floorplan_coords не проверяются. которые ID и координаты. Ниже весь мой код.

TestAnnotationBean.java

    class TestAnnotationBean {
        @Required
        @SerializedName("version")
        String version; 

        @Required
        @SerializedName("location_code")
        String locationCode;

        @Required
        @SerializedName("location_floor")   
        String locationFloor;

        @Required
        @SerializedName("floorplan_coords") 
        List<FloorplanCoords> floorplanCoords;

        public String getVersion() {
            return version;
        }

        public void setVersion(String version) {
            this.version = version;
        }

        public String getLocationCode() {
            return locationCode;
        }

        public void setLocationCode(String locationCode) {
            this.locationCode = locationCode;
        }

        public String getLocationFloor() {
            return locationFloor;
        }

        public void setLocationFloor(String locationFloor) {
            this.locationFloor = locationFloor;
        }

        public List<FloorplanCoords> getFloorplanCoords() {
            return floorplanCoords;
        }

        public void setFloorplanCoords(List<FloorplanCoords> floorplanCoords) {
            this.floorplanCoords = floorplanCoords;
        }

    }

FloorplanCoords.java

    class FloorplanCoords{

        @Required
        @SerializedName("id")       
        String id;

        @Required
        @SerializedName("coords")   
        String[] coords;

        public String getId() {
            return id;
        }

        public void setId(String id) {
            this.id = id;
        }

        public String[] getCoords() {
            return coords;
        }

        public void setCoords(String[] coords) {
            this.coords = coords;
        }

    }

Test.java

    public class Test {

        public static void main(String[] args) {


            Gson gson = new GsonBuilder()
                    .registerTypeAdapter(TestAnnotationBean.class, new AnnotatedDeserializer<TestAnnotationBean>())
                    .setLenient().create();

            String json = "[\n" + 
                    "  {\n" + 
                    "    \"version\": 1,\n" + 
                    "    \"location_code\": \"oa01\",\n" + 
                    "    \"location_floor\": 20,\n" + 
                    "    \"floorplan_coords\": [\n" + 
                    "      {\"id\": 0, \"coords\":[0,0]},\n" + 
                    "      {\"id\": 1, \"coords\":[0,50]},\n" + 
                    "      {\"id\": 2, \"coords\":[235,50]},\n" + 
                    "      {\"id\": 3, \"coords\":[235,0]}\n" + 
                    "    ]\n" + 
                    "  }\n" + 
                    "]";
            gson.fromJson(json, TestAnnotationBean[].class);
        }

    }

AnnotatedDeserializer.java

    class AnnotatedDeserializer<T> implements JsonDeserializer<T> {

        public T deserialize(JsonElement je, Type type, JsonDeserializationContext jdc) throws JsonParseException {

            T pojo = new Gson().fromJson(je, type);

            Field[] fields = pojo.getClass().getDeclaredFields();
            for (Field f : fields) {
                if (f.getAnnotation(Required.class) != null) {
                    try {
                        f.setAccessible(true);
                        if (f.get(pojo) == null) {
                            throw new JsonParseException("Missing field in JSON: " + f.getName());
                        }
                    } catch (IllegalArgumentException ex) {
                        ex.printStackTrace();
                    } catch (IllegalAccessException ex) {
                        ex.printStackTrace();
                    }
                }
            }
            return pojo;

        }
    }

Обязательный .java

    @Retention(RetentionPolicy.RUNTIME)
    @Target(ElementType.FIELD)
    public @interface Required
    {
    }

СЛУЧАЙ ВЫХОДОВ: 1

INPUT_JSON

[
  {
    "versio": 1,
    "location_code": "oa01",
    "location_floor": 20,
    "floorplan_coords": [
      {"id": 0, "coords":[0,0]},
      {"id": 1, "coords":[0,50]},
      {"id": 2, "coords":[235,50]},
      {"id": 3, "coords":[235,0]}
    ]
  }
]

Я изменил имя ключа версия на версию в INPUT_JSON тогда я получаю следующее исключение, которое вполне подходит.

    Exception in thread "main" com.google.gson.JsonParseException: Missing field in JSON: version
    at com.test.main.AnnotatedDeserializer.deserialize(Test.java:54)
    at com.google.gson.internal.bind.TreeTypeAdapter.read(TreeTypeAdapter.java:69)
    at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.read(TypeAdapterRuntimeTypeWrapper.java:41)
    at com.google.gson.internal.bind.ArrayTypeAdapter.read(ArrayTypeAdapter.java:72)
    at com.google.gson.Gson.fromJson(Gson.java:927)
    at com.google.gson.Gson.fromJson(Gson.java:892)
    at com.google.gson.Gson.fromJson(Gson.java:841)
    at com.google.gson.Gson.fromJson(Gson.java:813)
    at com.test.main.Test.main(Test.java:37)

CASE ВЫХОДОВ: 2

INPUT_JSON

[
  {
    "version": 1,
    "location_code": "oa01",
    "location_floor": 20,
    "floorplan_coords": [
      {"i": 0, "coords":[0,0]},
      {"id": 1, "coords":[0,50]},
      {"id": 2, "coords":[235,50]},
      {"id": 3, "coords":[235,0]}
    ]
  }
]

Выше JSON_INPUT я изменил имя дочернего ключа id на i , но по коду его не распознали И ничего не произошло. Так как это будет подтверждено?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...