java - com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException 在 JsonObject 中存储资源输出时
问题描述
我正在尝试使用 Jersey 客户端库自动化 REST API,因此我在我的 pom.xml 中遵循了依赖项 -
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.25.1</version>
</dependency>
<dependency>
<groupId>org.json</groupId>
<artifactId>json</artifactId>
<version>20190722</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.25.1</version>
</dependency>
和代码如下 -
@Test
public void test(){
Client client = ClientBuilder.newClient();
WebTarget webTarget = client.target("http://md5.jsontest.com/");
WebTarget zipTarget = webTarget.queryParam("text", 123);
Invocation.Builder invocationBuilder = zipTarget.request(MediaType.APPLICATION_JSON_TYPE);
JSONObject jsonObject = invocationBuilder.get(JSONObject.class);
}
但它会导致以下错误JSONObject jsonObject = invocationBuilder.get(JSONObject.class);
-
javax.ws.rs.client.ResponseProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "original" (class org.json.JSONObject), not marked as ignorable (0 known properties: ])
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@19b89d4; line: 2, column: 17] (through reference chain: org.json.JSONObject["original"])
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:809)
at org.glassfish.jersey.client.JerseyInvocation.access$700(JerseyInvocation.java:92)
at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:701)
at org.glassfish.jersey.internal.Errors.process(Errors.java:315)
at org.glassfish.jersey.internal.Errors.process(Errors.java:297)
at org.glassfish.jersey.internal.Errors.process(Errors.java:228)
at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:444)
at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:697)
at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:420)
at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:316)
at jerseyclienttest.JerseyTest.test(JerseyTest.java:23)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:133)
at org.testng.internal.TestInvoker.invokeMethod(TestInvoker.java:584)
at org.testng.internal.TestInvoker.invokeTestMethod(TestInvoker.java:172)
at org.testng.internal.MethodRunner.runInSequence(MethodRunner.java:46)
at org.testng.internal.TestInvoker$MethodInvocationAgent.invoke(TestInvoker.java:804)
at org.testng.internal.TestInvoker.invokeTestMethods(TestInvoker.java:145)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:146)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:128)
at java.util.ArrayList.forEach(ArrayList.java:1257)
at org.testng.TestRunner.privateRun(TestRunner.java:770)
at org.testng.TestRunner.run(TestRunner.java:591)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:402)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:396)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:355)
at org.testng.SuiteRunner.run(SuiteRunner.java:304)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:53)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:96)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1180)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1102)
at org.testng.TestNG.runSuites(TestNG.java:1032)
at org.testng.TestNG.run(TestNG.java:1000)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)
Caused by: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "original" (class org.json.JSONObject), not marked as ignorable (0 known properties: ])
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@19b89d4; line: 2, column: 17] (through reference chain: org.json.JSONObject["original"])
at com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException.from(UnrecognizedPropertyException.java:62)
at com.fasterxml.jackson.databind.DeserializationContext.handleUnknownProperty(DeserializationContext.java:834)
at com.fasterxml.jackson.databind.deser.std.StdDeserializer.handleUnknownProperty(StdDeserializer.java:1094)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownProperty(BeanDeserializerBase.java:1470)
at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.handleUnknownVanilla(BeanDeserializerBase.java:1448)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.vanillaDeserialize(BeanDeserializer.java:282)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:140)
at com.fasterxml.jackson.databind.ObjectReader._bind(ObjectReader.java:1580)
at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:961)
at com.fasterxml.jackson.jaxrs.base.ProviderBase.readFrom(ProviderBase.java:808)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.invokeReadFrom(ReaderInterceptorExecutor.java:256)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$TerminalReaderInterceptor.aroundReadFrom(ReaderInterceptorExecutor.java:235)
at org.glassfish.jersey.message.internal.ReaderInterceptorExecutor.proceed(ReaderInterceptorExecutor.java:155)
at org.glassfish.jersey.message.internal.MessageBodyFactory.readFrom(MessageBodyFactory.java:1085)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:874)
at org.glassfish.jersey.message.internal.InboundMessageContext.readEntity(InboundMessageContext.java:808)
at org.glassfish.jersey.client.ClientResponse.readEntity(ClientResponse.java:326)
at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:806)
... 37 more
您能否帮助了解这里还需要什么依赖项,或者 API 本身有什么问题?
解决方案
这是从将返回的 url 设置数据检索JSON
:
WebTarget webTarget = client.target("http://md5.jsontest.com/");
这将其JSON
转换为 Java 对象:
JSONObject jsonObject = invocationBuilder.get(JSONObject.class);
UnrecognizedPropertyException
表示返回JSON
的Java对象中的任何成员都不匹配JSONObject
。如果返回的 JSON 是:
{
"new": "ok",
"original": "notok"
}
会产生该错误的 Java 类是:
class Result {
private String new;
// getters/setters
}
可以修复错误的类是:
class Result {
private String new;
private String original;
// getters/setters
}
或者
@JsonIgnoreProperties
class Result {
private String new;
// getters/setters
}
但问题是,你正在传递JSONObject
一个内置类。您需要创建自己的类来处理与您正在使用的架构JSON
匹配的返回。JSON
推荐阅读
- ssl - Traefik 和 LetsEncrypt - DNS 问题 NXDOMAIN 查找 A for example.com
- netsuite - 如何将数据从 NetSuite 发布到其他 Web 服务
- python - 如何从经过验证的私有 Artifactory PyPI 存储库中提取 Python 包?
- c# - 在 ASP.NET 中添加 Session 后数据库未上传
- ios - 在子 ViewController 中重用父 ViewController 故事板文件
- oauth-2.0 - Doorkeeper如何为PKCE客户端实现刷新token
- mysql - MYSQL - 使用包含假期的日期行查找行增量
- linux - 将 Expect 与 shell 脚本捆绑以绕过 Expect 的安装
- java - java.lang.NumberFormatException:对于输入字符串:“-5,25”
- python - 即使安装了 BeautifulSoap 的 ImportError