【发布时间】:2016-01-01 18:25:39
【问题描述】:
我正在构建一个 RESTful Web 服务。我被锁定在无法继续进行的情况下。我有一个 DAO(一个 POJO),它有一个 JSONObject 作为成员变量。当我尝试从客户端(邮递员或用户定义的 javascript)进行 POST 调用并尝试调试时,JSONObject 的 getter 中收集的值是空的({}),而该类的其他成员获得了他们的适当价值观。我尝试用@XmlElement、@JsonProperty 等注释JSONObject 及其吸气剂。没有任何效果。
类看起来像:
package org.somepackage
import javax.xml.bind.annotation.XmlRootElement;
import org.codehaus.jackson.annotate.JsonAutoDetect;
import org.codehaus.jackson.annotate.JsonProperty;
import org.json.JSONObject;
@XmlRootElement
public class someClass {
private String someID;
private String someName;
private JSONObject someJsonObject;
public someClass () {
}
public someClass (String id, String name,
JSONObject jsonObj) {
someID=id;
someName=name;
someJsonObject=jsonObj;
}
public String getSomeID() {
return someID;
}
public void setSomeID(String id) {
this.SomeID= id;
}
public String getSomeName() {
return someName;
}
public void setSomeName(String name) {
this.someName= name;
}
public JSONObject getSomeJsonObject() {
return someJsonObject;
}
public void setSomeJsonObject(JSONObject jsonObj) {
this.someJsonObject= jsonObj;
}
}
感谢您的帮助! 谢谢。
编辑
示例 JSON
{
"name": "ABCD",
"ID": "P63784433",
"theJSON":{
"string":"foo",
"number":5,
"array":[1,2,3],
"object":{
"property":"value",
"subobj":{
"arr":["foo","ha"],
"numero":1
}
}
}
}
依赖 web.xml 对 Jackson 的依赖
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-mapper-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-core-asl</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-jaxrs</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>org.codehaus.jackson</groupId>
<artifactId>jackson-xc</artifactId>
<version>1.9.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.6.2</version>
</dependency>
通过 web.xml 注册资源和提供者
<!-- Register JAX-RS Application -->
<init-param>
<param-name>javax.ws.rs.Application</param-name>
<param-value>my.package.MyApplication</param-value>
</init-param>
<!-- Register resources and providers under my.package. -->
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>my.package</param-value>
</init-param>
<!-- Register custom provider -->
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>my.package.mapper.ObjectMapperProvider</param-value>
</init-param>`
MyApplication.java
`@ApplicationPath("/")
public class MyApplication extends ResourceConfig {
public MyApplication() {
// Register resources and providers using package-scanning.
packages("my.package");
register(ObjectMapperProvider.class);
}`
【问题讨论】:
-
创建另一个嵌套 POJO 类来表示 JSONObject 中的数据,否则对于任意数据格式,只需使用
Map而不是JSONObject -
谢谢@peeskillet,我听从了你的建议,但没有运气。无论其内容是什么,该对象仍被解析为空的
JSONObject。你知道是否有其他方法可以解决这个问题?我需要使用JSON的信息,可以使用Map吗? -
共享您通过 POST API 传递的正文和标头
-
@peeskillet! JSON 结构如下所示:
{ "name": "ABCD", "ID": "P63784433", "theJSON":{"string":"foo","number":5,"array":[1,2,3],"object":{"property":"value","subobj":{"arr":["foo","ha"],"numero":1}}} } -
@kyle ,正文是我在此评论上方发布的内容。同样关于标题,我发回了这种形式的回复:
Response.ok(someString,MediaType.APPLICATION_JSON).status(201).header(CorsHeaderConstants.HEADER_AC_ALLOW_METHODS,"GET POST DELETE PUT").header(CorsHeaderConstants.HEADER_AC_ALLOW_CREDENTIALS,"true").header(CorsHeaderConstants.HEADER_AC_ALLOW_ORIGIN,"*").header(CorsHeaderConstants.HEADER_AC_ALLOW_ORIGIN,"*").allow("OPTIONS").build();我想提一下,我的 POST API 一直在为其他类型的 POJO 工作,我只使用包含 JSONObject 的那个!
标签: java json jersey jackson jsonobject