Вы можете написать собственный десериализатор как this, зарегистрировать его и использовать fromJson метод, чтобы получить объект непосредственно из JSon строки. Таким образом, вы можете вернуть null
или исключить исключение в десериализаторе, если строка json отсутствует в ожидаемом формате.
Обратите внимание, что вам не нужно устанавливать каждое поле отдельно. После выполнения пользовательских проверок вы можете использовать десериализацию по умолчанию от context
.
EDIT: Если вы хотите получить только true
/false
вместо полного объекта, то вы можете написать MyBoolean
класс, держа простой boolean
значение и использовать fromJson
метод десериализации для MyBoolean
класса. Пользовательский десериализатор выполнит только нужные проверки и соответствующим образом настроит содержимое экземпляра MyBoolean
. Кроме того, (я думаю), если вы расширите этот MyBoolean
от Boolean, вы можете использовать его как boolean
.
EDIT 2: Мне не приходилось указывать пример кода раньше. Вот что я предлагаю:
package io.ram.ram;
import java.lang.reflect.Type;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonDeserializationContext;
import com.google.gson.JsonDeserializer;
import com.google.gson.JsonElement;
import com.google.gson.JsonParseException;
public class Tester {
public static class MyBoolean {
private boolean value;
public void set(boolean value) {
this.value = value;
}
public boolean get() {
return value;
}
}
public static class MyAdapter implements JsonDeserializer<MyBoolean> {
public MyBoolean deserialize(JsonElement json, Type type, JsonDeserializationContext context)
throws JsonParseException {
MyBoolean result = new MyBoolean();
result.set(false);
try {
result.set(json.getAsJsonObject().get("product").getAsString().equals("foobar"));
} catch (Exception e) {
}
return result;
}
}
public static void main(String[] args) {
Gson gson = new GsonBuilder().registerTypeAdapter(MyBoolean.class, new MyAdapter()).create();
System.out.println(gson.fromJson("{\"product\": \"foobar\"}", MyBoolean.class).get());
System.out.println(gson.fromJson("{\"product\": \"foobaz\"}", MyBoolean.class).get());
}
}
Как я уже говорил, после того, как вы зарегистрируетесь адаптер типа для пользовательских сериализации, вы можете добиться того, что вы хотите с одной строкой. (Примечание: Boolean класс является окончательным, поэтому мы не можем расширить его Извините за эту неверную информацию.).
Вы можете параметризуем MyAdapter
для строк "product"
и "foobar"
конечно, таким образом, вы не должны создавать такие классы для всех возможных случаев.
Вы изучали библиотеки запросов, такие как https://github.com/jayway/JsonPath? –
Я искал ту же самую функцию в 'gson' недавно и не нашел ее – xenteros