Могу ли я десериализовать строку JSON в существующий объект?
Я использую библиотеку GSON для работы с данными из Tone Analyzer API (IBM Bluemix)
В моем приложении я создаю ToneAnalysis
объект, используя статический метод, так как мне нужно только прочитать свойства объекта и никогда не создавать его новый экземпляр. Так что мне никогда не нужно будет делать это:
ToneAnalysis ta = new ToneAnalysis();
То, как я делаю вещи в данный момент:
string json = "{\"document_tone\": { ... } }";
ToneAnalysis ta = ToneAnalysis.fromJsonString(json)
Этот подход означает, что я получил закрытый пустой конструктор без параметров:
public class ToneAnalysis {
private DocumentTone document_tone;
public DocumentTone getDocumentTone() {
return this.document_tone;
}
public static ToneAnalysis fromJsonString(String json) {
return new Gson().fromJson(json, ToneAnalysis.class);
}
private ToneAnalysis() {
}
}
Так как fromJson
создает объект с помощью отражения. Я не могу сделать это:
this = gson.fromJson(json, ToneAnalysis.class);
Есть ли способ разрешить десериализацию объекта JSON в существующий объект или мне нужно переосмыслить свой дизайн?
1 ответ
мне нужно переосмыслить мой дизайн?
Не совсем, потому что ToneAnalysis
не имеетstatic
final
поля. Когда объект не имеет final
полей, то вы можете десериализовать JSON в этот объект следующим образом:
public class Foo {
Object foo, bar, baz, qux, foobar, barfoo;
public void deserializeJsonIntoThis(String json) {
Foo deserialized = new Gson().fromJson(json, Foo.class);
this.foo = deserialized.foo;
this.bar = deserialized.bar;
this.baz = deserialized.baz;
// ... copy other fields from deserialized to this like the above
}
}
В вашем случае единственное поле, которое вы должны скопировать, это document_tone
, Это означает, что вы можете десериализовать ToneAnalysis
JSON экземпляров в существующие ToneAnalysis
экземпляры с одной строчкой!
public void deserializeJsonIntoThis(String json) {
this.document_tone = fromJsonString(json).document_tone;
}