2016-10-20 4 views
0

Я использую библиотеку GSON для работы с данными из анализатора Tone API (IBM Bluemix)Могу ли я десериализовать строку JSON в существующий объект?

В моем приложении я создаю 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, чтобы быть deserialised в существующий объект или мне нужно пересмотреть свой дизайн?

+0

Сериализация в Java использует открытый конструктор no-arg. Вероятно, есть множество других способов сделать это, но они не являются сериализацией (как это определяет среда выполнения 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 с помощью однострочного интерфейса!

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

За исключением этого не будет работать, поскольку конструктор no-arg ToneAnalysis недоступен из 'Gson.fromJson'. – Tibrogargan

+0

Идти, чтобы продвигать это, потому что это своего рода шаг в правильном направлении. – Jake