简体   繁体   English

使用GSON从文件更新和读取JSON数组

[英]Update and Read JSON array from file using GSON

I have have a file containing following information in "file.text" I placed the file in webcontent folder. 我在“file.text”中有一个包含以下信息的文件我将文件放在webcontent文件夹中。

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. 我必须使用dopost方法在servlet类中读取和更新该文件。 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

You are passing an array of MyData but trying to convert them to MyData. 您正在传递MyData数组,但尝试将它们转换为MyData。 The following will work. 以下将有效。

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

Another approach and suggested by GSON would be having the proper TypeTokens. GSON建议的另一种方法是使用正确的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 参考: https//sites.google.com/site/gson/gson-user-guide#TOC-Array-Examples

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM