Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java如何覆盖jackson ObjectReader?_Java_Json_Rest_Jersey_Jackson - Fatal编程技术网

java如何覆盖jackson ObjectReader?

java如何覆盖jackson ObjectReader?,java,json,rest,jersey,jackson,Java,Json,Rest,Jersey,Jackson,我正在用jersey和jackson编写rest服务。我有点像 import com.mkyong.Track; @路径(“/json/metallica”) 公共类JSONService{ @得到 @路径(“/get”) @产生(MediaType.APPLICATION_JSON) 公共音轨GetTrackingson(){ 轨道=新轨道(); track.setTitle(“输入Sandman”); 赛辛格(“Metallica”); 返回轨道; } @职位 @路径(“/post”) @使

我正在用jersey和jackson编写rest服务。我有点像

import com.mkyong.Track;
@路径(“/json/metallica”)
公共类JSONService{
@得到
@路径(“/get”)
@产生(MediaType.APPLICATION_JSON)
公共音轨GetTrackingson(){
轨道=新轨道();
track.setTitle(“输入Sandman”);
赛辛格(“Metallica”);
返回轨道;
}
@职位
@路径(“/post”)
@使用(MediaType.APPLICATION_JSON)
公共MyResponse createTrackInJSON(跟踪跟踪){
返回新的MyResponse().setResult(true);
}
}
但是在我的例子中,classe轨迹不是一个简单的pojobean,我使用一个映射来保存我的数据,我创建了一个从我的对象生成json的方法和一个解析json数据的构造函数

公共类JsonObject{
映射数据=新的HashMap();
公共字符串toJson(){
返回“”;
}
}
公共类跟踪扩展了JsonObject{
公共曲目(字符串json){
//解析json
// [...]
}
公共轨道(JsonNode){
//解析节点
// [...]
}
公共字符串getTitle(){
if(data.containsKey(“标题”))
返回数据。获取(“标题”);
返回“”;
}
公共无效集合标题(字符串标题){
数据输入(“标题”,标题);
}
公共字符串getSinger(){
if(data.containsKey(“singer”))
返回数据。获取(“singer”);
返回“”;
}
公共歌手(弦乐歌手){
data.put(“singer”,singer);
}
@凌驾
公共字符串toString(){
返回“Track[title=“+getTitle()+”,singer=“+getSinger()+””;
}
公共字符串toJson(){
返回“{\”title\”:\”+getTitle()+“\”,\“singer\”:\”+getSinger()+“\”}”;
}
}
公共类MyResponse扩展了JsonObject{
公共布尔getResult(){
if(data.containsKey(“结果”))
返回(布尔)数据。获取(“结果”);
返回false;
}
公共MyResponse setResult(布尔值){
数据输入(“结果”,值);
归还这个;
}
@凌驾
公共字符串toString(){
返回“{\“result\”:“+getResult()+”}”;
}
}
所以我的问题是:有没有可能在方法调用之前和之后创建动作来告诉jackson如何生成或解析我的对象?使用注释和/或创建ObjectReader之类的东西

谢谢


编辑:

谢谢你,佩斯基勒

我不确定@JsonAnyGetter et@JsonAnySetter是我的解决方案。我有许多扩展JsonObject的对象,我想用RESTAPI的getter和setter保留它

因此,我创建了一个通用JsonSerializer:

公共类MyObjectSerializer扩展JsonSerializer{
@凌驾
公共void序列化(JsonObject值、JsonGenerator gen、SerializerProvider序列化器)
抛出IOException、JsonProcessingException{
gen.writeRaw(value.toJson());
}
}
然后我将此注释添加到MyResponse对象。

我希望我不必在每个对象中添加此注释,这是在rest服务返回期间自动完成的,但它工作正常,并且没有那么严格

现在我遇到了反序列化的另一个问题。我需要一个通用的反序列化程序,用参数JsonNode调用构造函数。但我怎么知道班级叫什么

我在@JsonDeserialize注释中看到了一个参数“as”

@JsonDeserialize(使用=MyObjectDeserializer.class,as=Track.class)
但我不知道如何在JsonDeserializer中获取这些信息。有什么想法吗


(也许我可以为这个问题打开另一个线程)

要在JAX-RS中配置Jackson,您可以注册一个,如中所示。如果需要,可以创建自定义序列化程序

对于上面发布的特定用例,像这样简单的使用方法可以在不做任何其他疯狂事情的情况下工作。用于反序列化

公共类JsonObject{
映射数据=新的HashMap();
@JsonAnyGetter
公共地图getData(){
返回数据;
}
@JSONANYSETER
公共void put(字符串字段、字符串值){
数据输入(字段、值);
}
公共字符串toJson(){
返回“”;
}
}
Jackson将序列化映射中的所有数据,就像它们是类或子类中的属性一样。因此,您不需要在
轨迹
类中添加任何属性。

我解决了我的问题

对于序列化,我为在contextResolver中定义的JsonObject创建了一个序列化程序。所有扩展JsonObject的类都使用此序列化程序进行序列化

公共类MyJsonSerializer扩展了JsonSerializer{
@凌驾
公共void序列化(JsonObject值、JsonGenerator gen、SerializerProvider序列化器)
抛出IOException、JsonProcessingException{
gen.writeRaw(value.toJson());
}
}
@提供者
公共类JacksonJsonProvider实现ContextResolver{
私有静态最终ObjectMapper MAPPER=新ObjectMapper();
静止的{
MAPPER.setSerializationInclusion(Include.NON_NULL);
enable(SerializationFeature.INDENT_输出);
configure(SerializationFeature.WRITE_DATES_作为时间戳,false);
}
公共JacksonJsonProvider(){
SimpleModule SimpleModule=新的SimpleModule(“SimpleModule”,新版本(1,0,0,null,null));
addSerializer(JsonObject.class,新的MyJsonSerializer());
映射器注册表模块(simpleModule);
}
@凌驾
公共对象映射器getContext(类类型){
debug(“JacksonProvider.getContext()调用类型:“+type”);
返回映射器;
}
}
对于反序列化,我使用注释@JsonCreator()来向jackson指示用于cre的方法
@JsonSerialize(using = MyObjectSerializer.class)
public class MyResponse ...
public class JsonObject {

    Map<String, String> data = new HashMap<>();

    @JsonAnyGetter
    public Map<String, String> getData() {
        return data;
    }

    @JsonAnySetter
    public void put(String field, String value) {
        data.put(field, value);
    }

    public String toJson(){
        return "";
    }
}