0

我正在使用 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 对象反序列化为现有对象,还是我需要重新考虑我的设计?

4

1 回答 1

0

我需要重新考虑我的设计吗?

不是真的,因为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;
}
于 2016-10-20T23:16:29.390 回答