简体   繁体   中英

Cannot deserialize JSON to POJO

I have a JSON stored in DB and I want to deserialize it into a POJO

JSON in DB

{
 "requests": [
  {
    "url": "http://localhost:8080/wst-server-1.0-SNAPSHOT/services/rest/",
    "path": "3/reset",
    "method": "POST",
    "statusCode": "204",
    "statusMessage": "No Content"
  },
  {
    "url": "http://localhost:8080/wst-server-1.0-SNAPSHOT/services/rest/",
    "path": "3/orders",
    "method": "POST",
    "statusCode": "201",
    "statusMessage": "Created"
  }  
 ]
}

the code

Gson gson = new Gson();
String json = gson.toJson(rs.getString(Columns.REQUEST.getName()));
logger.info(json);
ClientTask task = gson.fromJson(json, ClientTask.class);

logger.info(json) gives the following

"{\n  \"requests\": [\n    {\n      \"url\": \"http://localhost:8080/wst-server-1.0-SNAPSHOT/services/rest/\",\n      \"path\": \"3/reset\",\n      \"method\": \"POST\",\n      \"statusCode\": \"204\",\n      \"statusMessage\": \"No Content\"\n    },\n    {\n      \"url\": \"http://localhost:8080/wst-server-1.0-SNAPSHOT/services/rest/\",\n      \"path\": \"3/orders\",\n      \"method\": \"POST\",\n      \"statusCode\": \"201\",\n      \"statusMessage\": \"Created\"\n    }\n  ]\n}"

but the gson.fromJson(json, ClientTask.class); line throws this exception

Exception in thread "main" com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 486
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:180)
at com.google.gson.Gson.fromJson(Gson.java:755)
at com.google.gson.Gson.fromJson(Gson.java:721)
at com.google.gson.Gson.fromJson(Gson.java:670)
at com.google.gson.Gson.fromJson(Gson.java:642)
at cz.cvut.fit.wst.database.rowmapper.ClientTaskRowMapper.mapRow(ClientTaskRowMapper.java:30)
at cz.cvut.fit.wst.database.rowmapper.ClientTaskRowMapper.mapRow(ClientTaskRowMapper.java:1)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:92)
at org.springframework.jdbc.core.RowMapperResultSetExtractor.extractData(RowMapperResultSetExtractor.java:1)
at org.springframework.jdbc.core.JdbcTemplate$1.doInPreparedStatement(JdbcTemplate.java:648)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:586)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:636)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:665)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:673)
at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:728)
at cz.cvut.fit.wst.database.management.MySqlManager.getClientTask(MySqlManager.java:132)
at cz.cvut.fit.wst.client.rest.RestFrontend.main(RestFrontend.java:29)

Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 486
at com.google.gson.stream.JsonReader.expect(JsonReader.java:339)
at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:322)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:168)
... 16 more

POJOs

public class ClientTask {

    private String taskTypeId;
    private String userId;

    private List<ClientTaskRequest> requests;

}

public class ClientTaskRequest {

    private String url;
    private String path;
    private String method;
    private String body;
    private String statusCode;
    private String statusMessage;
    private String responseParser;

}

I tried to manually copy the String given by the logger and put that right to Gson and it worked. So why this doesn't?

If you already have JSON in the database field, don't serialize it again.

All you should need is:

Gson gson = new Gson();
String json = rs.getString(Columns.REQUEST.getName());
ClientTask task = gson.fromJson(json, ClientTask.class);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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