Java 如何防止gson尝试解析变量的值?
最近,我遇到了一个有趣的问题,就是使用gson库从对象中获取json字符串 我的对象有一个简单的形式:Java 如何防止gson尝试解析变量的值?,java,json,gson,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 payloa
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尝试解析变量的值
谢谢,
Laura。如果一个字段被标记为瞬态,它将被忽略,并且不包含在JSON中。Gson可以通过几种方式来实现这一点,标记字段瞬态,使用自定义反序列化排除策略并使用@Expose注释,尽管此注释与您的用例相反 尽管如此,您的示例案例似乎效果良好 请参阅《用户手册》中的部分。满是有用的东西! 从序列化和反序列化中排除字段 Gson支持许多排除顶级类的机制, 字段和字段类型。下面是允许 字段和类排除。如果以下任何一种机制都不能满足您的要求 然后您可以始终使用自定义序列化程序和反序列化程序 Java修饰符排除 默认情况下,如果将字段标记为瞬态,则会将其排除在外。像 如果一个字段被标记为static,那么默认情况下它是静态的 排除。如果您想包含一些瞬态字段,那么您可以这样做 以下是: 导入java.lang.reflect.Modifier Gson Gson=新的GsonBuilder .ExcludeFieldswithModifier.STATIC .创造 注意:可以使用任意数量的修改器常量 excludeFieldsWithModifier方法。例如:Gson Gson=new GsonBuilder .ExcludeFieldsWithModifier.STATIC、Modifier.TRANSIENT、Modifier.VOLATILE 创造Gson的@Expose 此功能提供了一种方法,您可以在其中标记 要排除的对象,以考虑序列化和 反序列化为JSON。要使用此注释,必须创建Gson 使用新的 GsonBuilder.excludeFieldsWithoutExposeAnnotation.create。这个 已创建的Gson实例将排除类中所有未创建的字段 标记为@Expose注释 下面的代码
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的值?您发布的代码对我来说很好。你一定在给我们看别的东西。发布完整的堆栈跟踪和完整的类。发布的代码不会产生错误。要么你使用的是一些古老版本的Gson,要么是发生了其他事情。实际的堆栈跟踪也会有帮助。我希望它包含在json中。我不希望在json形成过程中解析字段的值。因此,您希望能够读取它。fromJson,但不输出它。toJson?发布的代码没有任何问题。Gson不会在序列化期间尝试对myString的内容做任何事情。