最近我有一个有趣的问题,即使用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尝试解析变量的值?
谢谢, 劳拉。
答案 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注释标记。