2013-04-08 28 views
7

tôi truy cập vào một REST API sử dụng một URL mà mang lại cho tôi kết quả JSON sau:Jackson nhân vật bất ngờ ('h' (mã 104)): dự kiến ​​giá trị hợp lệ

{"size":1,"filter":{"applicationName":"xx.x1", 
"fromTimestamp":1261746800000, 
"toTimestamp":1361833200000, 
"company":"xx", 
"groupedBy":"COMPANY_APPLICATION"}, 

"values"[{"applicationName":"xx.x1","count":17,"company":"xx"}], 
"start":0,"limit":25,"lastPage":true} 

Sử dụng Jackson tôi cố gắng để phân tích cú pháp các json theo cách này:

  ObjectMapper mapper = new ObjectMapper(); 

     try { 
     ErrorDataRest error = mapper.readValue(url, ErrorDataRest.class); 
     Map<String,Object> map = mapper.readValue(url, Map.class); 

Dosn't vấn đề nếu tôi sử dụng đầu tiên hoặc thứ hai, tôi nhận được ngoại lệ này:

dk.jyskebank.jee.core.exception.JyskeSystemException: Auto generated exception 
at dk.sd.dumpmonitor.domainservice.RestErrorServiceBean.queryRESTurl(RestErrorServiceBean.java:46) 
at service.RestErrorServiceTest.testQueryRESTurl(RestErrorServiceTest.java:19) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) 
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) 
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) 
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71) 
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49) 
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193) 
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52) 
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) 
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) 
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184) 
at org.junit.runners.ParentRunner.run(ParentRunner.java:236) 
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) 
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) 
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) 
Caused by: org.codehaus.jackson.JsonParseException: Unexpected character ('h' (code 104)): expected a valid value (number, String, array, object, 'true', 'false' or 'null') 
at [Source: [email protected]; line: 1, column: 2] 
at org.codehaus.jackson.JsonParser._constructError(JsonParser.java:1433) 
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportError(JsonParserMinimalBase.java:521) 
at org.codehaus.jackson.impl.JsonParserMinimalBase._reportUnexpectedChar(JsonParserMinimalBase.java:442) 
at org.codehaus.jackson.impl.ReaderBasedParser._handleUnexpectedValue(ReaderBasedParser.java:1198) 
at org.codehaus.jackson.impl.ReaderBasedParser.nextToken(ReaderBasedParser.java:485) 
at org.codehaus.jackson.map.ObjectMapper._initForReading(ObjectMapper.java:2770) 
at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2718) 
at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1863) 
at dk.sd.dumpmonitor.domainservice.RestErrorServiceBean.queryRESTurl(RestErrorServiceBean.java:43) 
... 25 more 

tôi không có ý tưởng gì là sai hoặc làm thế nào để sửa chữa nó.

tôi không có quyền truy cập vào API còn lại, nhưng tôi biết nó sử dụng RESTeasy.

Điều duy nhất tôi muốn là ánh xạ phản hồi JSON tới một lớp Java, vì vậy có lẽ có một số cách khác để làm điều đó?

Trả lời

24

Tôi đoán biến của bạn urlString, chứ không phải là URL, vì vậy Jackson đang phân tích cú pháp URL như thể đó là chuỗi JSON thực tế. Điều này sẽ giải thích "ký tự không mong muốn" h ", vì đó có lẽ là chữ cái đầu tiên của URL của bạn (tức là http ... một cái gì đó.) Mã" 104 "tương ứng với giá trị ASCII của" h ".

Nếu bạn sử dụng mapper.readValue(new URL(url), ErrorDataRest.class); có hoạt động không?

0

này xảy ra với tôi sau khi tôi (một cách vụng về và dại dột) được sử dụng để có được echo XML vào một tập tin thử nghiệm:

echo "<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope"><s:Envelope>" \ 
> sampleXml 

Tất nhiên, nó bị mất tất cả các dấu ngoặc kép, và gây ra vấn đề này đối với tôi.

Đảm bảo rằng tất cả các thuộc tính của bạn đều có dấu ngoặc kép!

Các vấn đề liên quan