2012-04-18 2 views
0

내가 JSON은 DB에 저장 한을 POJO에 JSON을 역 직렬화 할 수 없습니다와 나는 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)로 직렬화 할

에 따라 제공
"{\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}" 
,

하지만 gson.fromJson(json, ClientTask.class); 라인이 예외

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; 

} 

내가 수동으로 로거에 의해 주어진 문자열을 복사 GSON에 그 권리를 넣어 시도하고 일했다

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 
가 발생합니다. 왜 이렇게하지 않습니까?

+0

잘못된 JSON은 ... 구문 분석하지 않습니다. 로그에 나와있는 것처럼 유효한 JSON이 없습니다. 모든 유효하지 않은'\ n'과 이스케이프 된 따옴표를 제거해야합니다. –

+0

NM - 잘못 읽었습니다. * JSON을 재분배하고 쓰레기를 받고 있습니다. 아래 매튜의 대답을보십시오. –

답변

3

이미 데이터베이스 필드에 JSON이있는 경우 다시 직렬화하지 마십시오.

모든 당신이 필요합니다입니다

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

아, 네 말이 맞아. 비슷한 부분의 코드를 복사 할 때 나는 그것을 놓쳤다 ... 나는 잠시 동안 그것을보고 있었고 그것을 알아 채지 못했다. 고맙습니다 – user219882