0

I have have a file containing following information in "file.text" I placed the file in webcontent folder.

var data = [
        {
            "id": "1",
            "name": "Mike",
            "Start_Date": "Sun 10/10/13",
            "Finish_Date": "Sun 12/12/13",
            "Position": "Trainee"

        },
        {
            "id": "2",
            "name": "Jhon",
            "Start_Date": "Sun 10/10/13",
            "Finish_Date": "Sun 12/12/13",
            "Position": "Developer"
        },
        {
            "id": "3",
            "name": "Pedro",
            "Start_Date": "Sun 10/10/13",
            "Finish_Date": "Sun 12/12/13",
            "Position": "Trainee"
        }
]

I have to read and update the file in servlet class using dopost method. But I am getting exception. Please support!

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("Invoked");
        Gson gson = new Gson(); 
        ServletContext ctx = getServletContext();

        JsonReader reader = new JsonReader(new FileReader(ctx.getRealPath("file.text")));
        MyyData[] myyData = gson.fromJson(reader, MyData.class);

        System.out.println(activityData);

        response.getWriter().write("response");
    } 

Exception Message:

Invoked
Jan 28, 2014 12:54:03 AM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [fi.aalto.dcse.visilean.devTestServlet] in context with path [/DevTestProject] threw exception
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:176)
    at com.google.gson.Gson.fromJson(Gson.java:803)
    at fi.aalto.dcse.visilean.devTestServlet.doPost(devTestServlet.java:41)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:409)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1044)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:315)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:722)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was BEGIN_ARRAY at line 1 column 2
    at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:374)
    at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:165)
    ... 23 more

1 Answer 1

2

You are passing an array of MyData but trying to convert them to MyData. The following will work.

MyyData[] myyData = gson.fromJson(reader, MyData[].class);

Another approach and suggested by GSON would be having the proper TypeTokens.

Type myDataType = new TypeToken<Collection<MyData>>(){}.getType();
Collection<MyData> myData = gson.fromJson(json, myDataType);

Reference: https://sites.google.com/site/gson/gson-user-guide#TOC-Array-Examples

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.