2016-10-20 2 views
0

나는 톤 분석기 API (IBM Bluemix) 난 단지 결코 개체 속성을 읽을하고 필요에 따라JSON 문자열을 기존 객체로 역 직렬화 할 수 있습니까?

내 응용 프로그램에서

, 나는 정적 방법을 사용하여 ToneAnalysis 객체를 생성 데이터로 작업 할 GSON 라이브러리를 사용하고 있습니다 그것의 새로운 인스턴스를 생성하십시오. 그래서 나는이 작업을 수행 할 필요가 없습니다 것입니다

ToneAnalysis ta = new ToneAnalysis();

방법 나는 순간에 일을하고있어입니다 ::

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

이 방법 I 개인 파라미터 유효로 만난다 의미 덜 빈 생성자 :

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 런타임에서 정의한대로) – Tibrogargan

+0

단순 : 사용자 정의 JSON 구문 분석기 만 작성하면됩니다. –

+0

Jackson은 Java 객체로 JSON을 deserialize 할 수 있습니다. – 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 인스턴스로 비대화 할 수 있습니다!

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

ToneAnalysis 인수가없는 생성자가'Gson.fromJson'에서 [여전히] 접근 할 수 없기 때문에 이것을 제외하고는 작동하지 않습니다. – Tibrogargan

+0

올바른 방향의 한 단계이기 때문에 이것을 upvote로 이동하십시오. – Jake