在 Spring MVC 中使用 Jackson JSON 解析 JSON

Posted

技术标签:

【中文标题】在 Spring MVC 中使用 Jackson JSON 解析 JSON【英文标题】:Parsing JSON in Spring MVC using Jackson JSON 【发布时间】:2011-08-26 13:09:34 【问题描述】:

好的,所以我已经研究了一段时间了,不再赘述。我有一个 Spring MVC servlet,我需要从 javascript 前端 Web 应用程序接受 JSON。要解析 JSON,我需要使用 Jackson。我需要获取 JSON 中的值,并按照它们在 JSON 中出现的顺序将它们存储到 List 中。我已经尝试将 JsonFactory 与 JsonParser 和 JsonNode 对象一起使用,但可以让它正常工作。我也尝试打开一个 BufferedReader 并逐行遍历请求正文,但也不能完全得到这个。我在这里查看了几个相关问题,但到目前为止没有一个对我有用。

知道的任何人都可以在这里为我指明正确的方向吗,带有示例的网页会很棒!

【问题讨论】:

使用 BufferedReader 并逐行迭代是一个非常糟糕的主意,因为您的代码可能会对从 Javascript 接收到的 json 格式的变化敏感。使用真正的 json 解析器要好得多。 请发布您尝试过的代码并告诉我们哪些地方不起作用(即您期望 A,但您得到 B),帮助您解决这些信息要容易得多。 【参考方案1】:

使用像 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 对象,它会将返回的 Object 的 JSON 视图序列化为 mime 类型为 application/json 的响应。

查看完整的工作示例see this previous answer of mine。

【讨论】:

这看起来和我想要的完全一样,谢谢。所以我认为我不需要创建一个新类,因为 JSON 将非常简单,例如:“pref1”,“pref2”...,所以我试图将它添加到列表中(@RequestBody List body),但这似乎没有收到以下错误消息,“Can not deserialize instance of java.util.List out of START_OBJECT token”。有什么想法吗? @NomNomNom 我以前没试过,猜你得去那里阅读 Jackson 文档。 你不必创建一个新类;但结构必须匹配:您不能将 JSON 对象绑定到 Java 数组或列表(原因很明显)。您的 JSON 具有带有属性(foo、bar、baz)的主级对象,并且每个属性都有不同类型的值(列表、字符串/布尔值、字符串/数字) @zodiac645 Fizzle fizzle = new ObjectMapper().readValue(json, Fizzle.class) @zodiac645 还有重载方法ObjectMapper.readValue(url, class) 但也许你应该为此创建自己的问题【参考方案2】:

我正在使用来自http://json-lib.sourceforge.net/的 json lib 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

【讨论】:

拜托:json-lib 已经过时了。使用 GSON 或 Jackson(OP 明确提到) Jackson lib 看起来很酷。就我而言, json-lib 就足够了。肖恩,无论如何,谢谢。

以上是关于在 Spring MVC 中使用 Jackson JSON 解析 JSON的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spring MVC 中使用 Jackson 和 Jersey 2 Client 反序列化 Joda DateTime?

在Spring 3 MVC中怎么动态的让jackson忽略字段

当使用 Spring MVC for REST 时,如何让 Jackson 漂亮地打印呈现的 JSON?

Spring MVC 接收的 JSON 嵌套对象的 Spring Boot JACKSON 配置

Spring MVC框架 学习笔记总结

spring Mvc json返回json的日期格式问题