2016-07-18 5 views
3

내 HTTP 요청의 페이로드를 JSON 문자열로 변환하고 Jackson 라이브러리를 사용하고 싶습니다. 먼저 Map으로 변환 한 다음 JSON 문자열로 변환합니다.Jackson과 HTTP 요청 페이로드 구문 분석

try { 

    ObjectMapper mapper = new ObjectMapper(); 
    JsonParser jsonParser = mapper.getFactory().createParser(httpRequest.getInputStream()); 

    System.out.println("JSON PARSER: " + jsonParser + 
         " TOKEN: " + jsonParser.getCurrentToken()); 

    Map<String, Object> jsonMap = mapper.readValue(jsonParser, Map.class); 

} catch (IOException e) { 
    e.printStackTrace(); 
} 

내가 얻을 예외 :

com.fasterxml.jackson.databind.JsonMappingException: No content to map due to end-of-input ERROR [stderr] (default task-2) at [Source: [email protected]; line: 1, column: 1] 
ERROR [stderr] (default task-2) at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:164) 
ERROR [stderr] (default task-2) at com.fasterxml.jackson.databind.ObjectMapper._initForReading(ObjectMapper.java:3029) 
ERROR [stderr] (default task-2) at com.fasterxml.jackson.databind.ObjectMapper._readValue(ObjectMapper.java:2944) 
ERROR [stderr] (default task-2) at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1587) 
ERROR [stderr] (default task-2) 
ERROR [stderr] (default task-2) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
2016-07-18 11:52:15,973 ERROR [stderr] (default task-2) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
2016-07-18 11:52:15,973 ERROR [stderr] (default task-2) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
2016-07-18 11:52:15,973 ERROR [stderr] (default task-2) at java.lang.reflect.Method.invoke(Method.java:606) 
2016-07-18 11:52:15,973 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:137) 
2016-07-18 11:52:15,973 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:280) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:234) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:221) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220) 
2016-07-18 11:52:15,974 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:61) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78) 
2016-07-18 11:52:15,975 ERROR [stderr] (default task-2) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:113) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.security.handlers.AuthenticationCallHandler.handleRequest(AuthenticationCallHandler.java:52) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:45) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:61) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:70) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.security.handlers.SecurityInitialHandler.handleRequest(SecurityInitialHandler.java:76) 
2016-07-18 11:52:15,976 ERROR [stderr] (default task-2) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:25) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:240) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:227) 
2016-07-18 11:52:15,977 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:73) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:146) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at io.undertow.server.Connectors.executeRootHandler(Connectors.java:168) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:687) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
2016-07-18 11:52:15,978 ERROR [stderr] (default task-2) at java.lang.Thread.run(Thread.java:724) 

다음 줄 :

System.out.println("JSON PARSER: " + jsonParser + 
        " TOKEN: " + jsonParser.getCurrentToken()); 

인쇄 :

JSON PARSER: [email protected] TOKEN: null 

내 토큰 오는 null입니다.

내가 누락 된 항목이 있습니까? HTTP 요청 스트림에서 데이터를 추출하는 방법은 무엇입니까?

+0

는 [여기]를 언급 한 같은 문제가 수를 (http://stackoverflow.com/q/8522568/1426227)? –

답변

1

다음은 트릭을해야 다음

// Read the request payload into a String 
StringBuilder buffer = new StringBuilder(); 
BufferedReader reader = request.getReader(); 
String line; 
while ((line = reader.readLine()) != null) { 
    buffer.append(line); 
} 
String data = buffer.toString(); 

// If the String is not empty, parses the payload into a map 
Map<String, Object> jsonMap = null; 
if (!data.isEmpty()) { 
    ObjectMapper mapper = new ObjectMapper(); 
    jsonMap = mapper.readValue(data, Map.class); 
} 
+0

네, 맞습니다. 그러나 클라이언트가 설정 한 내용이 없다면 위의 코드가 생기는 또 다른 문제가 있습니다 : 본문이없는 GET 요청과 마찬가지로이 예외도 예외입니다. com.fasterxml.jackson.databind.JsonMappingException : 내용 없음 지도가 입력 끝으로 인해 발생합니다. 스트림이 비어 있는지 확인하는 방법. 사용자가 데이터를 보내지 않습니다. ?? –

+1

@SiddharthTrikha 왜 GET 요청의 본문을 읽으시겠습니까? 'GET' 요청에는 시체가 없습니다. –

+0

예, 제 잘못입니다. 나는 비어있는 inputstream을 읽는 것이 동일한 예외를 또한 의미한다는 것을 의미한다. 빈 스트림을 확인하는 방법 ?? –

1

나는 이런 식으로 작업을 수행합니다

BufferedReader bufReader = new BufferedReader(new InputStreamReader 
    (new URL(myUrlString).openStream())); 

StringBuilder myStrBuilder = new StringBuilder(); 
    while((builderLine = bufReader.readLine()) != null) { 
     myStrBuilder.append(builderLine); 
    } 

JSONArray myJsonArry = new JSONArray(myStrBuilder.toString()); 
List<Object> myArrayList = new ArrayList<Object>(toList(myJsonArry)); 

Collection<Map<String,String>> mapsCol = new HashSet<Map<String,String>>(); 

for (int i=0; i < myArrayList.size(); i++) { 
    mapsCol.add((HashMap<String, String>)myArrayList.get(i)); 
}