2016-10-20 15 views
0

私は唯一のオブジェクトのプロパティを読み取る必要があるとして、私は自分のアプリケーションではトーンアナライザAPI(IBM Bluemix)からのデータを操作するためにJSON文字列を既存のオブジェクトに逆シリアル化できますか?

をGSONライブラリを使用しています、私は静的メソッドを使用してToneAnalysisオブジェクトを作成し、決して新しいインスタンスを作成します。だから私はこれを行う必要はありません:

ToneAnalysis ta = new ToneAnalysis();

方法私は、現時点で物事をやっていることです::

string json = "{\"document_tone\": { ... } }"; 
ToneAnalysis ta = ToneAnalysis.fromJsonString(json) 

このアプローチは、私がプライベートPARAMETER-になってしまったたことを意味し空でないコンストラクタ:

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オブジェクトが既存のオブジェクトに直列化復元されるか、私は私のデザインを再考する必要があることを可能にする方法はありますか?

+0

Javaのシリアライゼーションは、引数なしのコンストラクタを使用します。これを行う方法は他にもたくさんありますが、(Javaランタイムで定義されているように)シリアライゼーションではありません。 – Tibrogargan

+0

シンプル:独自のカスタムJSONパーサーを作成するだけです。 –

+0

JSONをJavaオブジェクトに逆シリアル化するのに役立つかもしれません。 – HARDI

答えて

0

私のデザインを再考する必要はありますか?

そうでもない、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インスタンスに1行にデシリアライズすることができます。

public void deserializeJsonIntoThis(String json) { 
    this.document_tone = fromJsonString(json).document_tone; 
} 
+0

ToneAnalysisの引数なしコンストラクタは '' Gson.fromJson'からまだアクセスできないので、これは動作しません。 – Tibrogargan

+0

これは正しい方向への一歩だからです。 – Jake

関連する問題