【问题标题】:How can I prevent gson to try to parse value of my variable? [closed]如何防止 gson 尝试解析我的变量的值? [关闭]
【发布时间】:2013-12-20 23:06:59
【问题描述】:

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

谢谢, 劳拉。

【问题讨论】:

  • 您发布的代码对我来说很好用。你一定是在向我们展示别的东西。发布完整的堆栈跟踪和您的完整课程。
  • 您发布的代码不会产生任何错误。要么您使用的是一些古老版本的 Gson,要么发生了其他事情。实际的堆栈跟踪也会有所帮助。

标签: java json gson


【解决方案1】:

以下代码

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的值吗?

【讨论】:

    【解决方案2】:

    如果一个字段被标记为transient,它将被忽略并且不包含在 JSON 中。

    【讨论】:

    • 我希望它包含在 json 中。我不希望在 json 形成过程中解析字段的值。
    • 所以你希望能够读取它(.fromJson())但不输出它(.toJson())?
    【解决方案3】:

    Gson 可以通过几种方式做到这一点,标记字段瞬态,使用自定义 DeserializationExclusionStrategy 和使用 @Expose 注释(尽管此注释与您的用例相反)

    话虽如此,您的示例案例似乎运行良好。

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

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

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

    Java 修饰符排除

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

    导入 java.lang.reflect.Modifier;

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

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

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

    【讨论】:

    • 发布的代码实际上没有任何问题。 Gson 在序列化过程中不会尝试对myString 的内容做任何事情。
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2011-12-23
    • 2018-07-11
    相关资源
    最近更新 更多