2017-06-19 141 views
0

有沒有辦法將一般對象序列化爲Json並將Json反序列化爲對象?
如果對象是一個實體,我可以使用Jackson 2 lib來達到目的。
但是,如果對象是一個普通的類,我該怎麼做?如何將一般對象序列化爲Json並將Json反序列化爲Java中的對象

例如,我想序列com.datastax.driver.core.querybuilder.Update到JSON並將其保存到數據庫,然後搜索並反序列化到Update對象,最後把它作爲com.datastax.driver.core.Session.execute(Statement)的參數execuate。

是否有可能重現Update對象?

我真正的目的是存儲Update,然後檢索並執行它。所以我想我可以將它保存爲JSON String,然後檢索並反序列化到原始的Update實例並執行它。如果這不是一個好方法,我該如何儲存Update然後檢索並執行它?
雖然我可以存儲text queryUpdate並檢索並執行text query,但Update中的某些其他信息可能會丟失,如ConsistencyLevel

回答

0

只是轉換了QueryBuilder.update到使用toString()方法

如果要存儲,檢索和執行QueryBuilder.update查詢字符串,你不必序列化和反序列化成JSON。

String query = QueryBuilder.update("exp").with(QueryBuilder.set("data", "This is a test data")).toString(); 
//Now you can store the text query directly to cassandra 
//And retrieve the text query 
session.execute(query); //Execute the query 

這裏是toString()

@Override 
public String toString() { 
    try { 
     if (forceNoValues) 
      return getQueryString(); 
     // 1) try first with all values inlined (will not work if some values require custom codecs, 
     // or if the required codecs are registered in a different CodecRegistry instance than the default one) 
     return maybeAddSemicolon(buildQueryString(null, CodecRegistry.DEFAULT_INSTANCE)).toString(); 
    } catch (RuntimeException e1) { 
     // 2) try next with bind markers for all values to avoid usage of custom codecs 
     try { 
      return maybeAddSemicolon(buildQueryString(new ArrayList<Object>(), CodecRegistry.DEFAULT_INSTANCE)).toString(); 
     } catch (RuntimeException e2) { 
      // Ugly but we have absolutely no context to get the registry from 
      return String.format("built query (could not generate with default codec registry: %s)", e2.getMessage()); 
     } 
    } 
} 

的代碼,你可以看到,它返回的實際查詢字符串

+0

是的,我想存儲,檢索並執行'com.datastax.driver.core.querybuilder.Update'查詢。 你的意思是使用'toString()'方法可以得到正確的文本查詢,然後直接執行它? 您確定這是**是否正確**複雜**更新操作? 我不知道'toString()'方法到底做了什麼。源代碼對我來說有點困難。 – niaomingjian

+0

儘管我可以獲取文本查詢,但我可能會在'Update'中丟失一些其他信息。 – niaomingjian

+0

@niaomingjian更新了答案,添加了'toString()'代碼。你可以看到它返回實際的查詢字符串。 –

0

最壞的情況下,你可以總是看看創建你的自己的自定義(德)序列化代碼。

請參閱herethere以供進一步閱讀。

含義:你可以看看你想要「序列化」的類的實現;然後編寫適用於該實現的代碼。

這樣做對於第三方代碼的主要缺點是:您現在必須跟蹤對第三方代碼的更改;作爲對更新類的更改,可能會輕易破壞您的自定義(de)序列化程序代碼。

+0

我真正的目的是存儲'Update',然後檢索並執行它。所以我想知道我是否可以使用Json格式來存儲它。還有其他方法可以做到嗎? – niaomingjian

+0

我給你提供了描述如何存儲任意類的對象的輸入。我真的不明白你的意思。這裏沒有魔法。 *您必須查看您想要序列化的類的實現,然後編寫代碼。我可以考慮的唯一選擇是:Google gson使用反射,所以它不需要Jackson期望的getter/setter方法。但是這聽起來像是你負擔過重了。最後:你會發現所有的答案都值得「重複」你的問題,但是他們沒有一個足以勝任你的問題嗎?非常激勵... – GhostCat

0

org.json提供了一個操縱json的簡單API。 有一種方法根據其getter創建類實例的JSONObject。 例如:

public class MyClass{ 
    private int id; 
    private String name, 

    public MyClass(int id_, String name_) { 
     this.id = id_; 
     this.name = name_; 
    } 

    public int getId() { return this.id; } 
    public int getName() { return this.name; } 

    //Create a JSONObject with a key-value for each getter of your class 
    public JSONObject toJson(){ 
     return new JSONObject(this); 
    } 
} 

然後,在你的代碼:

MyClass obj = new MyClass(1, "doe"); 
JSONObject json = obj.toJson(); 
System.out.println(json.toString()); 
// -> print : {"id":1,"name":"doe"} 

的API還提供型動物解析器,你可以編寫與一個JSONObject類的構造函數中提供:

public MyClass(JSONObject json){ 
    this.id= json.getInt("id"); 
    this.name= json.getString("name"); 
} 

完整文檔在:org.json official doc

+0

我真正的目的是存儲'Update',然後檢索並執行它。 'Update'是第三方代碼,不是我的。 – niaomingjian

+0

你的'Update'對象是否包含getters?如果是這樣,我的方法仍然有效。 – Asew