我可以将JSON字符串反序列化为现有对象吗?

时间:2016-10-20 22:42:59

标签: java json gson ibm-cloud tone-analyzer

我正在使用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 个答案:

答案 0 :(得分:0)

  

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

不是,因为id没有非ToneAnalysis static字段。当一个对象没有final个字段时,您可以将JSON反序列化为该对象,如下所示:

final

在您的情况下,您必须复制的唯一字段是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个实例' JSON到现有的ToneAnalysis实例中,只有一行!

ToneAnalysis