解析 JSON 对象时出现 NoClassDefFoundError JsonAutoDetect

Posted

技术标签:

【中文标题】解析 JSON 对象时出现 NoClassDefFoundError JsonAutoDetect【英文标题】:NoClassDefFoundError JsonAutoDetect while parsing JSON object 【发布时间】:2012-04-23 01:42:18 【问题描述】:

我正在使用亚马逊的云服务开发一个 web 应用程序,我需要使用 JSON 对象。我的项目是如何设置的,我有一个 html 表单,用户将在其中填写他们的信息并提交。提交后,数据将被放入在线数据库,并向他们发送确认电子邮件。在我可以将数据提交到数据库之前,我需要将所有数据放入一个 JSON 对象中。我用 Java 完成的 servlet 如下所示:

public class FormHandling extends HttpServlet 
    //doGet function
    public void doGet (HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException 
        // In this part of the code I take in the user data and build an HTML
        // page and return it to the user

        // Create String Mapping for User Data object
        Map<String,Object> userData = new HashMap<String,Object>();

        // Map the names into one struct. In the code below we are creating 
        // values for the nameStruct from the information the user has
        // submitted on the form.
        Map<String,String> nameStruct = new HashMap<String,String>();
        nameStruct.put("fName", request.getParameter("fname"));
        nameStruct.put("lName", request.getParameter("lname"));
        nameStruct.put("mInit", request.getParameter("minit"));

        // Map the three email's together (providing there are 3).
        // This is the same logic as the names.
        Map<String,String> emailStruct = new HashMap<String,String>();
        emailStruct.put("email", request.getParameter("email1"));
        emailStruct.put("email", request.getParameter("email2"));
        emailStruct.put("email", request.getParameter("email3"));

        // Put Name Hash Value Pair inside User Data Object
        userData.put("name", nameStruct);
        userData.put("emails", emailStruct);
        userData.put("age", 22);

        // Create the Json data from the userData
        createJson(userData);

        // Close writer
        out.close();
    

    public File createJson(Map<String,Object> userData) 
        throws JsonGenerationException, JsonMappingException, IOException 
        File user = new File("user.json");

        // Create mapper object
        ObjectMapper mapper = new ObjectMapper();

        // Add the userData information to the json file
        mapper.writeValue(user, userData);
        return user;
    

当我使用此代码提交表单时,我收到以下错误消息:

java.lang.NoClassDefFoundError: com/fasterxml/jackson/annotation/JsonAutoDetect com.fasterxml.jackson.databind.introspect.VisibilityChecker$Std.(VisibilityChecker.java:169) com.fasterxml.jackson.databind.ObjectMapper.(ObjectMapper.java:197) edu.tcnj.FormHandling.createJson(FormHandling.java:115) edu.tcnj.FormHandling.doGet(FormHandling.java:104) edu.tcnj.FormHandling.doPost(FormHandling.java:131) javax.servlet.http.HttpServlet.service(HttpServlet.java:641) javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

现在我知道该错误意味着它没有找到 Jackson 数据绑定库。我在 Eclipse 中进行开发,并且我知道构建路径有时会混乱,因此我还将库放在 WebContent\WEB-INF\lib 文件夹中。这解决了我之前遇到的问题。但是,这一次似乎并没有解决我的问题。我什至打开了 jar 文件以实际检查所需的库和类是否存在,它们确实存在。我已经尝试过搜索并寻找包含库的不同方法,但似乎没有任何效果。

【问题讨论】:

您能告诉我们您使用的是哪个版本的 Jackson 库吗? 我需要两个 JAR,jackson-core-lgpl-1.5.6.jarjackson-mapper-lgpl-1.5.6.jar 原来我错过了第三个罐子......呃。很简单。对我来说,我需要使用 jackson 数据绑定、核心和注释库。我使用的是 2.0 版。一旦我找到第三个罐子,它就很高兴。不过谢谢! 您应该将下面的标记为答案 您能否评论一下注解 .jar 文件的确切链接? 【参考方案1】:

对于未来来到这里的人来说,答案是:

如果您只复制了jackson corejackson databind,则需要jackson annotations 才能使用ObjectMapper

例如,确保你有这样的东西:

[16:32:01]:/android-project/libs     master]$ ls -lAF
total 2112
-rw-r--r--@ 1 jeffamaphone  staff   33525 Jun 18 16:06 jackson-annotations-2.0.2.jar
-rw-r--r--@ 1 jeffamaphone  staff  193693 Jun  7 16:42 jackson-core-2.0.2.jar
-rw-r--r--@ 1 jeffamaphone  staff  847121 Jun 18 15:22 jackson-databind-2.0.2.jar

【讨论】:

可以从wiki.fasterxml.com/JacksonDownload下载。 (为您节省一个谷歌。) 是否可以在没有 ObjectMapper 的情况下使用 Jackson 读写 Json? 当时,就我而言,没有它也可以读取一些 JSON。我不确定现在情况如何。 难道没有办法使用注释吗?我尝试了 MapperFeature.USE_ANNOTATIONS,但这似乎仍然需要 jar。 对于那些从进一步未来访问的人,这里是新的下载链接:github.com/FasterXML/jackson-annotations/wiki#downloads【参考方案2】:

为 maven 用户扩展 @jeffamaphone 的出色答案

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.7.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.7.3</version>
</dependency>

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-annotations</artifactId>
    <version>2.7.3</version>
</dependency>

【讨论】:

谢谢,在完成了 Spring Acessing Twitter Data 教程 spring.io/guides/gs/accessing-twitter 之后,这对我有用【参考方案3】:

或者如下gradle配置:

compile 'com.fasterxml.jackson.core:jackson-core:2.2.2'
compile 'com.fasterxml.jackson.core:jackson-databind:2.2.2'
compile 'com.fasterxml.jackson.core:jackson-annotations:2.2.2'

【讨论】:

【参考方案4】:

如果您使用 maven 并拥有所有库,就我而言,这是一个简单的 mvn cleanmvn install 固定问题。

【讨论】:

【参考方案5】:

如果您在 eclipse 中开发时正在/正在使用 tomcat 并收到此错误(可能是因为您按下了重新发布/清理),

右键项目->Maven->更新项目...

为我解决了这个问题。

此外,我确实还包括了来自 Johan Sjöberg 的依赖项

【讨论】:

以上是关于解析 JSON 对象时出现 NoClassDefFoundError JsonAutoDetect的主要内容,如果未能解决你的问题,请参考以下文章

Javascript:解析 document.cookie JSON 对象时出现问题

Newtonsoft:将 json 字符串解析为对象时出现“已超出读者的 MaxDepth 64”错误

解析为对象而不是数组时出现Json错误:JSONObject中的getJSONObject(java.lang.String)无法应用于(int)

在尝试解析 JSON 数据 W/System.err 时出现此错误:org.json.JSONException:对客户没有价值

解析“......没有方法'replace'”时出现JSON错误

解析我的 json 时出现问题,我得到这个“JSONDecodeError: Invalid \escape”