Java 意外字符('a'(代码 97)):应为有效值(数字、字符串、数组、对象、'true'、'false' 或 'null')

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/33631523/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-11 14:51:10  来源:igfitidea点击:

Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null')

javajsonrestjspservlets

提问by Dwhitz

I've just tried to calling index.jspwhich sends a json to my rest project with http POST.

我刚刚尝试调用index.jsp它使用 http POST 将 json 发送到我的其余项目。

But it throws me this error:
I can't figure out where is the issue Any tip? I haven't idea for this.

但这给我带来了这个错误:
我不知道问题出在哪里任何提示?我没有这个想法。

nov 10, 2015 2:30:37 PM org.apache.catalina.core.StandardWrapperValve invoke GRAVE: Servlet.service() for servlet [jersey-serlvet] in context with path [/HibernateTutorialWeb] threw exception [org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: org.apache.catalina.connector.CoyoteInputStream@24097548; line: 1, column: 2]] with root cause org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') at [Source: org.apache.catalina.connector.CoyoteInputStream@24097548; line: 1, column: 2] at org.codehaus.Hymanson.JsonParser._constructError(JsonParser.java:1213) at org.codehaus.Hymanson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:375) at org.codehaus.Hymanson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:306) at org.codehaus.Hymanson.impl.Utf8StreamParser._handleUnexpectedValue(Utf8StreamParser.java:1536) at org.codehaus.Hymanson.impl.Utf8StreamParser._nextTokenNotInObject(Utf8StreamParser.java:432) at org.codehaus.Hymanson.impl.Utf8StreamParser.nextToken(Utf8StreamParser.java:318) at org.codehaus.Hymanson.map.ObjectMapper._initForReading(ObjectMapper.java:2168) at org.codehaus.Hymanson.map.ObjectMapper._readValue(ObjectMapper.java:2106) at org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1004) at org.codehaus.Hymanson.jaxrs.HymansonJsonProvider.readFrom(HymansonJsonProvider.java:410) at com.sun.jersey.json.impl.provider.entity.HymansonProviderProxy.readFrom(HymansonProviderProxy.java:139) at com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474) at com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123) at com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46) at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153) at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203) at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75) at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108) at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147) at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469) at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349) at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339) at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537) at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699) at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:423) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1079) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:620) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:318) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)

2015 年 11 月 10 日下午 2:30:37 org.apache.catalina.core.StandardWrapperValve 调用 GRAVE:Servlet [jersey-serlvet] 的 Servlet.service() 在路径 [/HibernateTutorialWeb] 的上下文中抛出异常 [org.codehaus.Hymanson .JsonParseException: Unexpected character ('a' (code 97)): 在 [Source: org.apache.catalina. connector.CoyoteInputStream@24097548; line: 1, column: 2]] 与根本原因 org.codehaus.Hymanson.JsonParseException: Unexpected character ('a' (code 97)): 期望一个有效值(数字,字符串,数组,对象,'真',' false' 或 'null') 在 [来源:org.apache.catalina.connector.CoyoteInputStream@24097548; 行:1,列:2] 在 org.codehaus.Hymanson.JsonParser。

index.jsp:

索引.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
    pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <title>Send jSon - put method</title>

    </head>
    <body>
    <script>
    //var people = {"address": "Address 12", "name": "twelve", "id": 12,"surname": "twelve"};
    var people={"address": "hello"};
    function sendobject(){
      $.ajax({
            type: "POST",
            url: "http://localhost:8080/HibernateTutorialWeb/rest/person/post",
            data: people,
            contentType: "application/json; charset=utf-8",
            dataType: "json",
            success: function(data){alert(data);},
            failure: function(errMsg) {
                alert(errMsg);
            }
      });
    }
    </script>
        <input type="button" onclick="sendobject()" value="invia"> </input>
        <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
    </body>
</<html>

PersonService . java

人员服务。爪哇

package com.ws.service;

import java.util.List;

import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;

import com.dao.*;
import com.model.*;

@Path("/person")
public class PersonService {

    // try hello data
    // http://localhost:8080/HibernateTutorialWeb/rest/person/hello/mario
    @GET
    @Path("/hello/{param}")
    public Response getMsg(@PathParam("param") String msg) {

        String output = "Jersey say hello : " + msg;

        return Response.status(200).entity(output).build();
    }

    // http://localhost:8080/HibernateTutorialWeb/rest/person/2
    @GET
    @Path("{id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Person getPersonById(@PathParam("id") int id) {
        return new PersonDao().getPersonById(id);
        // error for type of response incorrect
        /*
         * public ResponseBuilder getPersonById(@PathParam("id") int id){
         * PersonDao pDao = new PersonDao (); if(pDao.getPersonById(id) != null)
         * {return Response.status(200).entity(new
         * PersonDao().getPersonById(id));} else{ return
         * Response.status(200).entity("Utente id: "+ id + ", Rimosso"); }
         */
    }

    // //http://localhost:8080/HibernateTutorialWeb/rest/person/getAllJson
    @GET
    @Path("/getAllJson")
    @Produces(MediaType.APPLICATION_JSON)
    public List<Person> getAllJson() {
        return new PersonDao().getAllPerson();
    }

    @GET
    @Path("/xml/{id}")
    @Produces(MediaType.APPLICATION_XML)
    public Person getPersonByIdXML(@PathParam("id") int id) {
        return new PersonDao().getPersonById(id);
    }

    @POST
    @Path("/post")
    @Produces(MediaType.APPLICATION_JSON)
    @Consumes(MediaType.APPLICATION_JSON)
    public Response createUtenteJSON(Person person) {
        new PersonDao().saveOrUpdate(person);
        String result = "Person saved : " + person;
        return Response.status(201).entity(result).build();
    }

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response updateUtente(Person person) {
        if (person.getId() != 0) {
            new PersonDao().saveOrUpdate(person);
            return Response.ok(person, MediaType.APPLICATION_JSON).build();
        } else {
            return Response.status(Response.Status.BAD_REQUEST)
                    .entity("Specificare l'id dell'utente").build();
        }
    }

    @DELETE
    @Path("{id}")
    public Response removePerson(@PathParam("id") Integer id) {
        new PersonDao().deletePerson(id);
        return Response.status(200).entity("Utente id: " + id + ", Rimosso")
                .build();
    }

}

PersonDao.java

人道

package com.dao;

import java.util.ArrayList;
import java.util.List;

import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.model.Person;
import com.util.SessionFactoryUtil;

public class PersonDao {

    public void saveOrUpdate(Person person) {
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();

        try {
            trns = session.beginTransaction();
            if (person.getId() != 0) {
                //if exists update obj
                session.update(person);
            } else {
                session.save(person);
            }
            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
    }

    public void deletePerson(int id) {
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            Person person = (Person) session.load(Person.class, new Integer(id));

            System.out.println("Deleted person :"+person.toString());

            session.delete(person);

            session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }

    }

    public List<Person> getAllPerson() {
        List<Person> people = new ArrayList<Person>();
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            people = session.createQuery("from Person").list();

            //session.getTransaction().commit();
        } catch (RuntimeException e) {
            if (trns != null) {
                trns.rollback();
            }
        } finally {
            session.flush();
            session.close();
        }
        System.out.println("People list : \n");
        for(int i=0;i<people.size();i++){
            System.out.println(people.get(i));
        }
        return people;
    }

    public Person getPersonById(int id) {
        Person person = null;
        Transaction trns = null;
        Session session = SessionFactoryUtil.getSessionFactory().openSession();
        try {
            trns = session.beginTransaction();
            String queryString = "FROM Person WHERE id = :id";
            Query query = session.createQuery(queryString);
            query.setInteger("id", id);
            person = (Person) query.uniqueResult();
        } catch (RuntimeException e) {
            e.printStackTrace();
        } finally {
            session.flush();
            session.close();
        }
        return person;
    }

}

Updated :on index.jsp

更新:在 index.jsp 上

var people = JSON.parse({"address": "Indirizzo 12", "name": "dodici", "id": 12,"surname": "dodici"});

Now the error is this :

现在错误是这样的:

    HTTP Status 500 - java.io.EOFException: No content to map to Object due to end of input

type Exception report

message java.io.EOFException: No content to map to Object due to end of input

description The server encountered an internal error that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: java.io.EOFException: No content to map to Object due to end of input
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:420)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.io.EOFException: No content to map to Object due to end of input
    org.codehaus.Hymanson.map.ObjectMapper._initForReading(ObjectMapper.java:2173)
    org.codehaus.Hymanson.map.ObjectMapper._readValue(ObjectMapper.java:2106)
    org.codehaus.Hymanson.map.ObjectMapper.readValue(ObjectMapper.java:1004)
    org.codehaus.Hymanson.jaxrs.HymansonJsonProvider.readFrom(HymansonJsonProvider.java:410)
    com.sun.jersey.json.impl.provider.entity.HymansonProviderProxy.readFrom(HymansonProviderProxy.java:139)
    com.sun.jersey.spi.container.ContainerRequest.getEntity(ContainerRequest.java:474)
    com.sun.jersey.server.impl.model.method.dispatch.EntityParamDispatchProvider$EntityInjectable.getValue(EntityParamDispatchProvider.java:123)
    com.sun.jersey.server.impl.inject.InjectableValuesProvider.getInjectableValues(InjectableValuesProvider.java:46)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$EntityParamInInvoker.getParams(AbstractResourceMethodDispatchProvider.java:153)
    com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$ResponseOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:203)
    com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:288)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1469)
    com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1400)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1349)
    com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1339)
    com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:537)
    com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:699)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

采纳答案by Dwhitz

Solved by me,

由我解决,

There was an error on my jsp. I was checking if it's a new user from the id.

我的jsp有错误。我正在检查它是否是来自 id 的新用户。

Backend

后端

if (person.getId() != 0) {
     //if exists update obj
     session.update(person);
} else {
     session.save(person);
}

Jsp:

jsp:

var people = JSON.stringify
(eval({"address": "Indirizzo 12", "name": "twelve", "id": 12, "surname": "twelve"}));

So with the Id, the dao try to update a record inexistent on db, and this is the cause of the error.

因此Id,使用 dao 尝试更新 db 上不存在的记录,这就是错误的原因。

Now thy is my peoplevar in jsp :

现在你是我people在 jsp 中的变量:

var people = 
JSON.stringify(eval({"address": "Indirizzo 12", "name": "twelve","surname": "twelve"}));

It works good.

它运作良好。

回答by Jiri Tousek

What the error message says is that the POST input the server received was not a valid JSON.

错误消息表明服务器收到的 POST 输入不是有效的 JSON。

Probably what JQuery produces out of this input: var people={"address": "ciao"};isn't what you expect. You can try sniffing what was actually transmitted over the HTTP request (using Firebug, Wireshark etc.).

可能 JQuery 从这个输入中产生的东西:var people={"address": "ciao"};不是你所期望的。您可以尝试嗅探通过 HTTP 请求实际传输的内容(使用 Firebug、Wireshark 等)。



Try using:

尝试使用:

var people='{"address": "ciao"}';

instead of

代替

var people={"address": "ciao"};

回答by Husam

Try to change the Objectto JSONline:

尝试更改ObjecttoJSON行:

var people={"address": "ciao"};

To:

到:

var people=JSON.stringify(eval({"address": "ciao"}));

Make sure that Personclass has the same param constructor you passing to it.

确保Person该类具有您传递给它的相同参数构造函数。



According to your image stack trace exception in the comment, The error occurs in the Hibernatewith Exception StaleStateExceptionwhich means:

根据您在注释中的图像堆栈跟踪异常,该错误发生在Hibernatewith Exception StaleStateException 中,这意味着:

Thrown when a version number or timestamp check failed, indicating that the Session contained stale data (when using long transactions with versioning). Also occurs if we try delete or update a row that does not exist

当版本号或时间戳检查失败时抛出,表明 Session 包含陈旧数据(当使用带有版本控制的长事务时)。如果我们尝试删除或更新不存在的行,也会发生

  1. This can be resolved by updating the object from database like refresh method in hibernate and then commit will persist the object in databse.
  2. You can use merge method and commit, but here you will override the current data.
  3. Using lock can also be resolved to change the state.
  1. 这可以通过从数据库更新对象来解决,例如休眠中的刷新方法,然后提交将对象持久化到数据库中。
  2. 您可以使用合并方法和提交,但在这里您将覆盖当前数据。
  3. 使用锁也可以解决改变状态。