Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.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 @JSonIgnore注释的等效代码设置是什么?_Java_Json_Serialization_Jackson_Json Serialization - Fatal编程技术网

Java @JSonIgnore注释的等效代码设置是什么?

Java @JSonIgnore注释的等效代码设置是什么?,java,json,serialization,jackson,json-serialization,Java,Json,Serialization,Jackson,Json Serialization,我不熟悉Java和Jackson以及我尝试使用的许多其他技术,因此我希望您能给出详细的答案 有没有办法防止使用Jackson将一个或多个字段序列化为JSON类似字符串的格式,但不使用任何类型的JSON注释 类似于:mapper.getSerializationConfig().Something(忽略(“显示名称”))如果您知道我的意思的话。 我的对象是一个类的实例,它扩展了另一个类,并实现了一个接口,依此类推,因此字段来自类的层次结构。 我需要该对象的JSON表示,但只包含某些字段,因此我可以

我不熟悉
Java
Jackson
以及我尝试使用的许多其他技术,因此我希望您能给出详细的答案

有没有办法防止使用
Jackson
将一个或多个字段序列化为
JSON
类似字符串的格式,但不使用任何类型的
JSON
注释

类似于:
mapper.getSerializationConfig().Something(忽略(“显示名称”))
如果您知道我的意思的话。 我的对象是一个类的实例,它扩展了另一个类,并实现了一个接口,依此类推,因此字段来自类的层次结构。 我需要该对象的
JSON
表示,但只包含某些字段,因此我可以通过
POST
方法在模拟请求中发送该
JSON

我正在使用
Jackson
2.2.2
如果你不能更改你的类,你可以用
@JsonIgnore
注释的方法创建新的
抽象类
/
接口
。在此
/
接口
中,您可以定义
对象映射器
序列化
/
反序列化过程中应跳过的方法

请参见以下示例:

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        Person person = new Person();
        person.setId(1L);
        person.setName("Max");

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.addMixIn(Person.class, PersonMixIn.class);

        System.out.println(objectMapper.writeValueAsString(person));
    }
}

abstract class Entity {

    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

interface Namamble {
    String getName();
}

class Person extends Entity implements Namamble {

    private String name;

    @Override
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

interface PersonMixIn {
    @JsonIgnore
    String getName();
}
编辑-回答评论

您可以创建这样的mixin接口:

public static interface UserInformationMixIn {
    @JsonIgnore
    String getField3();
}
并通过以下方式配置
ObjectMapper

objectMapper.addMixInAnnotations(UserInformation.class, UserInformationMixIn.class);
在版本
2.5
中,方法
addmixinnotations
已被弃用,应使用
addMixIn

objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);
完整示例源代码:

import java.io.IOException;

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonProgram {

    public static void main(String[] args) throws IOException {
        UserInformation userInformation = new UserInformation();
        userInformation.setField3("field3");
        userInformation.setField4("field4");
        userInformation.setField5("field5");

        User user = new User();
        user.setField1(userInformation);
        user.setField2("field2");

        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.addMixIn(UserInformation.class, UserInformationMixIn.class);
        objectMapper.addMixIn(User.class, UserInformationMixIn.class);

        System.out.println(objectMapper.writeValueAsString(user));
    }

    public static abstract class Someclass {
        String field5;

        public String getField5() {
            return field5;
        }

        public void setField5(String field5) {
            this.field5 = field5;
        }
    }

    public static class UserInformation extends Someclass {
        String field3;
        String field4;

        public String getField3() {
            return field3;
        }

        public void setField3(String field3) {
            this.field3 = field3;
        }

        public String getField4() {
            return field4;
        }

        public void setField4(String field4) {
            this.field4 = field4;
        }
    }

    public static class User {
        UserInformation field1;
        String field2;

        public UserInformation getField1() {
            return field1;
        }

        public void setField1(UserInformation field1) {
            this.field1 = field1;
        }

        public String getField2() {
            return field2;
        }

        public void setField2(String field2) {
            this.field2 = field2;
        }
    }

public static interface UserInformationMixIn {
    @JsonIgnore
    String getField3();

    @JsonIgnore
    String getField2();

    @JsonIgnore
    String getField5();
}
}
有用链接:


如果可以编辑主类或接口,则只需在字段声明中使用关键字
transient
。临时字段不会被序列化。例如:
public transient int test谢谢你的回答,但是我不能触摸主课。否则,我会在特定字段上使用注释JSonIgnore,所有问题都会得到解决。这就是我担心的,然后您可以尝试使用如下示例中的视图:。谢谢您,mykhaylo,我将尝试按照您的示例进行操作。抽象类Someclass{String field5;}类用户信息扩展了Someclass{String field3;String field4;}类用户{UserInformation field1;String field2;}很抱歉格式化,如果没有使用mixin类的field3,如何序列化field1?这是一个稍微更复杂的班级结构,但如果你回答我的问题,我可以很容易地适应。再次感谢。我检查过了,但我需要15点的声誉才能投票,对不起。也许我可以晚些时候再做,等我得到更多的声誉积分。再次感谢。@Max,请看一下方法。