【问题标题】:How do I parse this JSON string using GSON in servlet如何在 servlet 中使用 GSON 解析这个 JSON 字符串
【发布时间】:2012-11-18 20:30:00
【问题描述】:

如何解析这个 JSON 字符串以在 servlet 中创建集合对象

{"title":["1","2"],"amount":["1","3"]}

我的 servlet 中的内部类

public class Data {
    private List<String> title;
    private List<String> amount;
  //getters and setters
}

解析json

Gson gson = new Gson();
String param=request.getParameter("info");
Data data = gson.fromJson(param, Data.class);
List<String> a=data.getTitle();
 if(a==null){p("a null");}else{p("a not null");} //here a is null, prints "a null"

这里是我如何创建 json 字符串 http://jsfiddle.net/testtracker/XDNLp/ 的 jsfiddle

表单提交功能中的客户端

var dataString=JSON.stringify($(this).serializeObject());
$.ajax({
    type: "POST",
    url: URL,
    data: {"info":JSON.stringify($(this).serializeObject())},
    success: function(data){

    }
  });

这是我到目前为止所拥有的。我走对了吗?接下来我应该对 System.print 它们做什么?

【问题讨论】:

  • 是的,你走对了。我不明白是什么问题?
  • Hmm toString() 方法中的数据覆盖和打印...
  • 问题是当我调用getter方法和System.print时,出现空指针异常
  • 你能添加所有代码吗? (也是产生异常的代码)
  • 你为什么不在服务器上打印参数,这样你就可以看到你实际得到了什么,而不是你在客户端做什么。

标签: java json servlets gson


【解决方案1】:

当我无法解决问题时,我会编写尽可能小的程序来验证我的理解是否正确。在你的情况下,我想出了这个:

import java.util.List;
import com.google.gson.Gson;
public class GsonTest {

public static class Data {
    private List<String> title;
    public List<String> getTitle() {return title;}
    public Data() {}
}

public static void main (String [] args) {
    Gson gson = new Gson();
    Data data = gson.fromJson("{\"title\":[\"1\",\"2\"]}", Data.class);
    System.out.println(data.getTitle());
} 
}

编译运行,输出:

["1", "2"]

所以我仍然认为 servlet 接收到的输入不正确(或者您没有提供对现有代码的准确描述)。请将上面的示例与您的真实代码进行比较。

【讨论】:

  • 是的,这个例子有效,感谢这个,我将尝试通过与这个比较来制作我的代码。谢谢
  • 这个例子对我很有帮助,因为我第一次使用 json,我一直在寻找完整的通用解决方案,在 SO 上进行了搜索,但这些问题是针对他们的问题的,无论如何感谢 +1 并接受这个
【解决方案2】:

试试

public class Data {
    private ArrayList<String> title;
    private ArrayList<String> amount;
  //getters and setters
}

List 是一个抽象类(所以 GSON 不知道如何创建它)

【讨论】:

  • 您不能在对象Data 中使用抽象类作为List。因为GSON不能获取抽象类的实例,所以不可能。
  • 但现在我有 ArrayList
  • 你可以为title写getter吗?也许你有构造函数?
  • 这是我在 Data public ArrayList getTitle() { return title; } , Data 中没有构造函数
  • 这是我的设置方法 public void setTitle(ArrayList title) { this.title = title; } 表单字段名称必须与 setter 方法中的变量相同?
猜你喜欢
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多