2013-12-20 26 views
-3

最近我有一個有趣的問題,使用gson庫從對象中獲取json字符串。如何防止gson嘗試解析我的變量的值?

我的對象具有一個簡單的形式:

class MyObject{ 
public String myString = "{\"payload\":\"test\"}"; 

setters & getters 
} 

MyString的值是一個JSON字符串。

所以,當我試圖使用

MyObject myObject = new myObject(); 
Gson gson = new Gson(); 
String payload = gson.toJson(myObject); 

我得到了一個異常說:

無法處理表達式求值 「JSON:有效載荷」。

所以它看起來像gson試圖解析myObject中的字段的值,這是意想不到的和奇怪的。

我該如何防止gson試圖解析我的變量的值?

謝謝, 勞拉。

+0

您發佈的代碼適合我。你必須向我們展示別的東西。發佈完整的堆棧跟蹤和全班。 –

+0

您發佈的代碼不會產生錯誤。要麼你使用的是Gson的一些古代版本,或者還有其他事情正在發生。實際的堆棧跟蹤也會有所幫助。 –

回答

0

如果一個字段被標記爲transient,它將被忽略並且不包含在JSON中。

+0

我希望它被包含在json中。我不希望在json形成過程中解析字段的值。 – Laura

+0

所以你想能夠讀取它('.fromJson()')但不輸出它('.toJson()')? –

0

GSON可以做到這一點在幾個方面,標誌着場短暫的,使用自定義DeserializationExclusionStrategy和使用的@expose註釋的(雖然這注解是您的使用案例的倒數)話雖這麼說

,你示例情況似乎它工作正常。

請參閱用戶指南的部分。充滿有用的東西! https://sites.google.com/site/gson/gson-user-guide

剔除字段從序列化和反序列化

GSON支持用於排除頂級類衆多機制, 字段和字段類型。下面是允許 字段和類排除的可插入機制。如果以下任何一種機制都不滿足您的需求,那麼您始終可以使用自定義序列化器和反序列化器。

的Java修改排除

默認情況下,如果標記字段作爲短暫的,它會被排除在外。至於 那麼,如果一個字段被標記爲「靜態」,那麼默認情況下它將被排除在 之外。如果你想包含一些瞬態字段,那麼你可以做以下幾項:

import java.lang.reflect.Modifier; ();

Gson gson = new GsonBuilder() .excludeFieldsWithModifier(Modifier.STATIC) .create();

注意:您可以使用任何數量的修飾符常量到 「excludeFieldsWithModifier」方法。例如:Gson gson = new GsonBuilder() .excludeFieldsWithModifier(Modifier.STATIC,Modifier.TRANSIENT,Modifier。VOLATILE) .create(); Gson's @Expose

此功能提供了一種方法,您可以將要排除的 對象的某些字段標記爲序列化,並將 反序列化爲JSON。要使用此批註,您必須使用新的 GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。create()創建Gson 。 Gson實例創建的 將排除標有@Expose註釋的不是 的類中的所有字段。

+0

發佈的代碼幾乎沒有錯。在序列化過程中,Gson不會嘗試對'myString'的內容做任何事情。 –

2

下面的代碼

public static void main(String[] args) { 
    MyObject original = new MyObject(); 
    Gson gson = new Gson(); 
    String payload = gson.toJson(original); // generate json 
    System.out.println(payload); 
    MyObject recreated = gson.fromJson(payload, MyObject.class); // parse json 
    System.out.println(recreated.myString); 
} 

static class MyObject { 
    public String myString = "{\"payload\":\"test\"}"; 
} 

打印

{"myString":"{\"payload\":\"test\"}"} 
{"payload":"test"} 

所以我看不出有什麼你擔心。我沒有得到任何錯誤。

我該如何防止gson試圖解析我的變量的值?

是否要在生成的json中生成myString的值?