我有一个这样的模型:
private String message;
private Integer errorCode;
private String data;
Run Code Online (Sandbox Code Playgroud)
我从远程和消息中获取JSON字符串,errorCode变量获取正确的值.但是我不想反序列化到我的数据变量.我希望它是一个json字符串,如:
{"data": {"cat": "1.2.3.4", "ner": "80", "name": "pinta" }, "message" : "m", "errorCode" : 12}
Run Code Online (Sandbox Code Playgroud)
之后,我将反序列化它以反对自己.我怎样才能做到这一点?
PS:澄清问题:
我得到一个类似的Json字符串:
{"data":{"cat":"1.2.3.4","ner":"80","name":"pinta"},"message":"m","errorCode":12}
反序列化后,我的变量应具有以下值:
{"cat": "1.2.3.4", "ner": "80", "name": "pinta" }
Run Code Online (Sandbox Code Playgroud) 我们在Apache CXF和Jackson之上运行了一整套JAX-RS REST服务.我们使用JAXB注释来处理将POJO编组为JSON,效果很好.
但是,我们有一两个地方要返回原始JSON字符串(我们从Redis缓存中获取).
杰克逊总是将字符串用双引号括起来,并将其中的所有双引号都删掉,例如
@GET @Produces("application/json")
public Response getData() {
String json = ...get from Redis...
return Response.ok(json,"application/json").build()
}
Run Code Online (Sandbox Code Playgroud)
给我们
"{\"test\":1}"
Run Code Online (Sandbox Code Playgroud)
代替
{"test":1}
Run Code Online (Sandbox Code Playgroud)
我尝试过多种方法,将RawSerializer(String.class)添加到Object映射器中,没有任何效果.唯一有效的是,如果我将媒体类型设置为普通字符串,绕过杰克逊,但是不好,因为我返回了错误的内容类型
即
return Response.ok(json,"text/plain").build()
Run Code Online (Sandbox Code Playgroud)
工作,但很差(错误的内容类型,这搞砸了.Net WCF应用程序打电话给我们)
简短版本是:如何jsonb使用Spring Data Rest PATCH方法修补Postgres 字段中包含的JSON对象?
这是长版本,请考虑以下实体:
@Entity
@Table(name = "examples")
public class Example {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String jsonobject;
@JsonRawValue
public String getJsonobject() {
return jsonobject == null ? null : jsonobject;
}
public void setJsonobject(JsonNode jsonobject) {
this.jsonobject = jsonobject == null ? null : jsonobject.toString();
}
}
Run Code Online (Sandbox Code Playgroud)
jsonobject是Postgres类型jsonb.这些getter/setter是为这里提到的Spring Data Rest序列化/反序列化它的方法.我们还尝试给该字段提供自己的类型,如这些答案中所述.
我们的目标是使用Spring Data Rest修补此字段包含的JSON对象.
例如:
GET /examples/1
{
"id": 1,
"jsonobject": {
"foo": {"bar": …Run Code Online (Sandbox Code Playgroud) 我正在使用Jersey(1.9.1)并将JAXB用于我的对象,并尝试添加一个简单的JSON对象字段,理想情况下是Jackson的JsonNode类型,但我也可以使用jettison的JSONObject(甚至是GSON的JsonObject)/JsonElement)
原因是因为我想允许发送'自由格式'json(作为我们示例中的obj元素),以及同一对象上的其他元素(使用JAXB注释)
我的目标:
import org.codehaus.jettison.json.JSONObject;
@XmlRootElement(name="moo")
@XmlAccessorType(XmlAccessType.FIELD)
public class Moo {
@XmlElement
JSONObject obj;
...
}
Run Code Online (Sandbox Code Playgroud)
我的资源:
@Path("/moo")
@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response postMsg(Moo e) {
System.out.println(e);
return Response.status(200).entity(e).build();
}
Run Code Online (Sandbox Code Playgroud)
有效载荷:
{"obj": {"my": "custom", "object": 1, "here": [1, 2, 3] } }
Run Code Online (Sandbox Code Playgroud)
使用上述执行POST请求时 - obj是空的JSONObject.同样的事情发生了,当我试着用杰克逊JsonNode和GSON的JsonElement/ JsonObject.
但是,当我JSONObject用作方法的arg时,它能够解析它
@Path("/moo")
@POST
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.APPLICATION_JSON})
public Response postMsg(JSONObject e) {
System.out.println(e);
return Response.status(200).entity(e).build();
}
Run Code Online (Sandbox Code Playgroud)
我认为这是因为Jersey使用自己com.sun.jersey.json.impl.provider.entity.JSONObjectProvider的编组,而JAXB使用自己的marshller.
有没有办法解决这个问题,同时仍然使用JAXB的注释(对于其他领域)?我尝试XmlAdapter使用自定义(使用@XmlJavaTypeAdapter注释)而没有任何成功(因为我得到的对象ValueType是一个DOM元素) …