Чтобы ответить на этот вопрос, нам нужно посмотреть, как вы анализируете JSON
.Я предполагаю, что вы используете простейшее:
Test test = gson.fromJson(new FileReader(jsonFile), Test.class);
Если это ваш случай, ответ на ваш вопрос: Gson
недостаточно умен, чтобы сделать это.Если вы проверите реализацию этого метода, вы обнаружите:
public <T> T fromJson(Reader json, Class<T> classOfT) throws JsonSyntaxException, JsonIOException {
JsonReader jsonReader = newJsonReader(json);
Object object = fromJson(jsonReader, classOfT);
assertFullConsumption(object, jsonReader);
return Primitives.wrap(classOfT).cast(object);
}
Перед тем, как метод вернет значение, он проверяет, было ли использовано целое JSON
, а в случае отсутствия выбрасывается JsonIOException
.Gson
внутренне использует TypeAdapter
реализацию для данного типа.Для вашего пользовательского MyClass
будет использоваться класс ReflectiveTypeAdapterFactory.Adapter
, который будет использовать всю полезную нагрузку JSON
.Чтобы избежать этой ситуации, вы можете написать свой собственный TypeAdapter
:
class TestTypeAdapter extends TypeAdapter<Test> {
@Override
public void write(JsonWriter out, Test value) throws IOException {
throw new IllegalStateException("Implement me!");
}
@Override
public Test read(JsonReader in) throws IOException {
if (in.peek() == JsonToken.NULL) {
in.nextNull();
return null;
}
Test test = new Test();
try {
in.beginObject();
while (in.hasNext()) {
String name = in.nextName();
if (name.equals("foo")) {
test.setFoo(in.nextString());
break;
}
}
} catch (IllegalStateException e) {
throw new JsonSyntaxException(e);
}
return test;
}
}
Простое использование:
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonSyntaxException;
import com.google.gson.TypeAdapter;
import com.google.gson.stream.JsonReader;
import com.google.gson.stream.JsonToken;
import com.google.gson.stream.JsonWriter;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
public class GsonApp {
public static void main(String[] args) throws Exception {
File jsonFile = new File("./resource/test.json").getAbsoluteFile();
Gson gson = new GsonBuilder().create();
Test test = gson.fromJson(new FileReader(jsonFile), Test.class);
Test test1 = new TestTypeAdapter().fromJson(new FileReader(jsonFile));
System.out.println(test);
System.out.println(test1);
}
}
class Test {
private String foo;
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
@Override
public String toString() {
return "Test{" +
"foo='" + foo + '\'' +
'}';
}
}
Надпечатки кода выше:
Test{foo='small_value'}
Test{foo='small_value'}
As, выКак видите, в обоих случаях мы проанализировали small value
.Вы можете проверить этот код и вычислить, насколько быстрее пользовательский TypeAdapter
для вашей JSON
полезной нагрузки.
Но в случае, если у вас сложная ситуация, и вам нужно проанализировать гораздо больше JSON
, чтобы найти свою ценность, попробуйте использовать JSONPath
решение.Вы можете начать с этого вопроса: как проанализировать огромный JSON-файл, не загружая его в память .