如何防止gson尝试解析变量的值?

时间:2013-12-20 23:06:59

标签: java json gson

最近我有一个有趣的问题,即使用gson库从对象中获取json字符串。

我的对象有一个简单的形式:

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:payload”。

所以看起来gson试图解析myObject中字段的值,这是出乎意料和奇怪的。

如何防止gson尝试解析变量的值?

谢谢, 劳拉。

3 个答案:

答案 0 :(得分: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的值?

答案 1 :(得分:0)

如果字段标记为transient,则会忽略该字段,但不包括在JSON中。

答案 2 :(得分:0)

Gson可以通过几种方式执行此操作,使用自定义DeserializationExclusionStrategy标记场瞬态,并使用@Expose注释(尽管此注释与用例相反)

话虽如此,您的示例案例似乎工作正常。

请参阅用户指南部分。充满了有用的东西! https://sites.google.com/site/gson/gson-user-guide

从序列化和反序列化中排除字段

  

Gson支持多种排除顶级类的机制,   字段和字段类型。以下是允许的可插拔机制   领域和阶级排除。如果以下机制都不满足您的要求   然后你可以随时使用自定义序列化器和反序列化器。

     

Java修饰符排除

     

默认情况下,如果将字段标记为瞬态,则会将其排除。如   好吧,如果一个字段标记为“静态”,那么默认情况下它将是   排除。如果您想要包含一些瞬态字段,那么您可以这样做   以下内容:

     

import java.lang.reflect.Modifier;

     

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

     

注意:您可以使用任意数量的修饰符常量   “excludeFieldsWithModifier”方法。例如:Gson gson = new   GsonBuilder()       .excludeFieldsWithModifier(Modifier.STATIC,Modifier.TRANSIENT,Modifier.VOLATILE)       。创建(); Gson的@Expose

     

此功能提供了一种标记您的某些字段的方法   要排除的对象以考虑序列化和   反序列化为JSON。要使用此批注,您必须创建Gson   通过使用新的   GsonBuilder()。excludeFieldsWithoutExposeAnnotation()。创建()。该   创建的Gson实例将排除类中没有的所有字段   用@Expose注释标记。