【问题标题】:Tomcat servlet acting strange with json objectTomcat servlet 对 json 对象表现得很奇怪
【发布时间】:2013-06-11 11:01:05
【问题描述】:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    Gson gson = new Gson();
    LocationTypes locTypes = new LocationTypes();
    String json = gson.toJson(locTypes);

    out.print(json);
    out.flush();
}

如果我采用上面的代码和 System.out.println(json),它看起来像这样:

    {"locationTypes":["Hospital","Church","Restaurant","Bar","Other"]}

我在浏览器中得到了什么,当指向 servlet 的 url 时,我得到了这个:

    {"calls":{"threadLocalHashCode":-2084311414},"typeTokenCache":{"com.google.gson.InstanceCreator\u003c?\u003e":{},"int":{},"java.lang.String":{},"java.lang.String[]":{},"java.util.Map\u003ccom.google.gson.reflect.TypeToken\u003c?\u003e, com.google.gson.TypeAdapter\u003c?\u003e\u003e":{},"java.util.List\u003ccom.google.gson.TypeAdapterFactory\u003e":{},"java.lang.ThreadLocal\u003cjava.util.Map\u003ccom.google.gson.reflect.TypeToken\u003c?\u003e, com.google.gson.Gson$FutureTypeAdapter\u003c?\u003e\u003e\u003e":{},"com.google.gson.TypeAdapterFactory":{},"com.google.gson.JsonDeserializationContext":{},"com.google.gson.reflect.TypeToken\u003c?\u003e":{},"java.util.Map\u003cjava.lang.reflect.Type, com.google.gson.InstanceCreator\u003c?\u003e\u003e":{},"com.google.gson.Gson":{},"boolean":{},"java.lang.reflect.Type":{},"data.LocationTypes":{},"java.lang.Class\u003c? super ?\u003e":{},"java.lang.Integer":{},"com.google.gson.internal.ConstructorConstructor":{},"com.google.gson.TypeAdapter\u003c?\u003e":{},"com.google.gson.JsonSerializationContext":{}},"factories":[null,null,{"version":-1.0,"modifiers":136,"serializeInnerClasses":true,"requireExpose":false,"serializationStrategies":[],"deserializationStrategies":[]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{"constructorConstructor":{"instanceCreators":{}}},{"constructorConstructor":{"instanceCreators":{}},"complexMapKeySerialization":false},{"constructorConstructor":{"instanceCreators":{}},"fieldNamingPolicy":"IDENTITY","excluder":{"version":-1.0,"modifiers":136,"serializeInnerClasses":true,"requireExpose":false,"serializationStrategies":[],"deserializationStrategies":[]}}],"constructorConstructor":{"instanceCreators":{}},"serializeNulls":false,"htmlSafe":true,"generateNonExecutableJson":false,"prettyPrinting":false}

【问题讨论】:

  • LocationTypes 类是什么样的?
  • 你在哪里设置 locTypes 是那个 JSON 文档?你能把所有的代码都给我们吗?

标签: json jakarta-ee tomcat servlets gson


【解决方案1】:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("application/json");
    PrintWriter out = response.getWriter();
    Gson gson = new Gson();
    LocationTypes locTypes = new LocationTypes();
    String json = gson.toJson(locTypes);
    response.setContentType("application/json");
    out.print(json);
    out.flush();
}

尝试如上设置内容类型

【讨论】:

    【解决方案2】:

    这是原始代码吗?

    你确定没有这样的错字:

    out.print(gson);
    

    因为奇怪的 JSON 看起来确实像一个序列化的 GSON 库对象...

    【讨论】:

    • 不要生气,但请允许我坚持:似乎您的 JSON 是这种类型的确切 JSON 表示:google-gson.googlecode.com/svn/trunk/gson/src/main/java/com/… 抱歉,如果我错了,请忽略 :)
    • 我同意 Pragmateek 的观点。感觉给定的信息中有错字/错误。字符串不能根据 Stream 以不同的方式输出。似乎 OP 正在将 GSON 对象转换为 JSON ?
    • @Pragmateek 他正在将他的GSON 对象转换为json。这本质上是一些错字,由于缺少信息而看不到。
    • 有时不需要太多,一个字母。 :)
    【解决方案3】:

    更新

    我已经重现了您的错误。 不幸的是,您正在传递要转换为 JSON 的 gson 对象。 您的问题是错字/错误的结果。

    我运行了以下代码:

    public static void main (String args[])
        {   
              Gson gson = new Gson();
              String json = gson.toJson(gson);
              System.out.println(json);
        }
    

    并收到以下信息:

    {"calls":{"threadLocalHashCode":1253254570},"typeTokenCache":{"com.google.gson.Gson":{},"com.google.gson.reflect.TypeToken\u003c?\u003e":{},"com.google.gson.internal.ConstructorConstructor":{},"com.google.gson.InstanceCreator\u003c?\u003e":{},"java.lang.reflect.Type":{},"boolean":{},"int":{},"com.google.gson.JsonDeserializationContext":{},"com.google.gson.JsonSerializationContext":{},"java.lang.ThreadLocal\u003cjava.util.Map\u003ccom.google.gson.reflect.TypeToken\u003c?\u003e, com.google.gson.Gson$FutureTypeAdapter\u003c?\u003e\u003e\u003e":{},"java.util.List\u003ccom.google.gson.TypeAdapterFactory\u003e":{},"java.util.Map\u003cjava.lang.reflect.Type, com.google.gson.InstanceCreator\u003c?\u003e\u003e":{},"com.google.gson.TypeAdapter\u003c?\u003e":{},"java.lang.Integer":{},"com.google.gson.TypeAdapterFactory":{},"java.lang.Class\u003c? super ?\u003e":{},"java.util.Map\u003ccom.google.gson.reflect.TypeToken\u003c?\u003e, com.google.gson.TypeAdapter\u003c?\u003e\u003e":{}},"factories":[null,null,{"version":-1.0,"modifiers":136,"serializeInnerClasses":true,"requireExpose":false,"serializationStrategies":[],"deserializationStrategies":[]},null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,{"constructorConstructor":{"instanceCreators":{}}},{"constructorConstructor":{"instanceCreators":{}},"complexMapKeySerialization":false},{"constructorConstructor":{"instanceCreators":{}},"fieldNamingPolicy":"IDENTITY","excluder":{"version":-1.0,"modifiers":136,"serializeInnerClasses":true,"requireExpose":false,"serializationStrategies":[],"deserializationStrategies":[]}}],"constructorConstructor":{"instanceCreators":{}},"serializeNulls":false,"htmlSafe":true,"generateNonExecutableJson":false,"prettyPrinting":false}
    

    感谢 Pragmateek 还检查了 GSON SVN 存储库。

    原答案

    System.out.println(json); 给你的结果真的不可能和

    out.print(json);
    out.flush();
    

    json 是一个字符串,在任何流中都显示相同。

    您是否检查过某处没有错字? 我建议您在项目中完全复制并粘贴代码。

    在浏览器中,您将获得一个对象的 JSON 版本,该对象已将所有对象的值/字段序列化为 JSON。

    正如 Pragmateek 所说,您生成的 JSON 中的许多键都是您尝试序列化为 JSON 的对象的实际字段。

    几乎可以怀疑您正在传递要转换为 JSON 的 GSON 对象....

    【讨论】:

      猜你喜欢
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-21
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多