Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何防止gson尝试解析变量的值?_Java_Json_Gson - Fatal编程技术网

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

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

最近,我遇到了一个有趣的问题,就是使用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尝试解析变量的值

谢谢,
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的内容做任何事情。