Могу ли я десериализовать строку 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 не имеетstaticfinal поля. Когда объект не имеет 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;
}
Другие вопросы по тегам