在Spring MVC中使用Jackson JSON解析JSON

46

好的,我已经花了一些时间研究这个问题,但仍然没有进展。我有一个Spring MVC servlet需要接受来自JavaScript前端Web应用程序的JSON。为了解析JSON,我需要使用Jackson。我需要将JSON中的值按出现顺序存储到列表中。我尝试使用JsonFactory、JsonParser和JsonNode对象,但无法完全搞定。我还尝试打开BufferedReader并逐行迭代请求体,但同样也无法完全搞定。我查看了这里的几个相关问题,但目前都没有对我起作用。

请问有没有懂得这方面知识的人可以指点我一下,一个带有示例的网页会很棒!


1
使用BufferedReader并逐行迭代是一个非常糟糕的想法,因为您的代码可能会对来自JavaScript的JSON格式进行更改敏感。更好的方法是使用真正的JSON解析器。 - Robin Green
1
请提供你尝试过的代码,并告诉我们它出了什么问题(即你期望得到A,但实际却得到了B),有了这些信息,帮助你解决问题就会变得更加容易。 - matt b
2个回答

103
使用像Jackson这样的映射技术的整个目的是,你可以使用对象(无需自己解析JSON)。
定义一个类似于你期望的JSON的Java类。
例如,这个JSON:
{
"foo" : ["abc","one","two","three"],
"bar" : "true",
"baz" : 1
}

可以映射到这个类:

public class Fizzle{
    private List<String> foo;
    private boolean bar;
    private int baz;
    // getters and setters omitted
}

现在如果你有一个像这样的控制器方法:

@RequestMapping("somepath")
@ResponseBody
public Fozzle doSomeThing(@RequestBody Fizzle input){
    return new Fozzle(input);
}

如果您传入上面的JSON,Jackson将自动为您创建一个Fizzle对象,并使用MIME类型application/json将返回的对象序列化为JSON视图并输出到响应中。

完整的工作示例请参见我的先前答案


这看起来正是我想要的,谢谢。因此,我认为我不需要创建一个新类,因为JSON将非常简单,如:{"pref1","pref2"...},所以我试图将其添加到List(@RequestBody List<String> body)中,但是这似乎没有得到以下错误消息:“无法将java.util.List的实例反序列化为START_OBJECT令牌”。有什么想法吗? - MeanwhileInHell
@NomNomNom 我以前没尝试过,你可能需要去阅读一下Jackson文档。 - Sean Patrick Floyd
您无需创建新类,但结构必须匹配:您不能将JSON对象绑定到Java数组或列表中(出于明显的原因)。您的JSON具有主级对象和属性(foo、bar、baz),每个属性都具有不同类型的值(列表、字符串/布尔值、字符串/数字)。 - StaxMan
1
@zodiac645 Fizzle fizzle = new ObjectMapper().readValue(json, Fizzle.class) @zodiac645:Fizzle fizzle = new ObjectMapper().readValue(json,Fizzle.class) - Sean Patrick Floyd
1
@zodiac645 还有一个重载方法ObjectMapper.readValue(url, class),但也许你应该为此创建自己的问题。 - Sean Patrick Floyd
显示剩余5条评论

2
我正在使用来自http://json-lib.sourceforge.net/的json库
json-lib-2.1-jdk15.jar。
import net.sf.json.JSONObject;
...

public void send()
{
    //put attributes
    Map m = New HashMap();
    m.put("send_to","my@admin.lan");
    m.put("email_subject","this is a test email");
    m.put("email_content","test email content");

    //generate JSON Object
    JSONObject json = JSONObject.fromObject(content);
    String message = json.toString();
    ...
}

public void receive(String jsonMessage)
{
    //parse attributes
    JSONObject json = JSONObject.fromObject(jsonMessage);
    String to = (String) json.get("send_to");
    String title = (String) json.get("email_subject");
    String content = (String) json.get("email_content");
    ...
}

更多示例在这里 http://json-lib.sourceforge.net/usage.html

该网址提供了更多的示例。

9
请注意:json-lib已经非常过时了,建议使用GSON或Jackson(OP明确提到这两个库)。 - Sean Patrick Floyd
Jackson库看起来很棒。在我的情况下,json-lib就足够了。谢谢Sean。 - denny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接