Я работаю с 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 , но по коду его не распознали И ничего не произошло. Так как это будет подтверждено?