Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.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在不同的情况下映射这些值两次?_Java_Json_Jackson - Fatal编程技术网

Java 为什么Jackson在不同的情况下映射这些值两次?

Java 为什么Jackson在不同的情况下映射这些值两次?,java,json,jackson,Java,Json,Jackson,我使用Jackson将Java对象映射到JSON,该对象是一个非常简单的pojo类,如下所示: import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.JsonProperty; @JsonAutoDetect public class Area { @JsonProperty("Id") public int Id; @JsonPro

我使用Jackson将Java对象映射到JSON,该对象是一个非常简单的pojo类,如下所示:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonAutoDetect
public class Area {
    @JsonProperty("Id")
    public int Id;
    @JsonProperty("Name")
    public String Name;

    public Area() {
        Name = "";
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }
}
ObjectMapper mapper = new ObjectMapper();

mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

areaJSON = mapper.writeValueAsString(area);
映射代码如下所示:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonProperty;

@JsonAutoDetect
public class Area {
    @JsonProperty("Id")
    public int Id;
    @JsonProperty("Name")
    public String Name;

    public Area() {
        Name = "";
    }

    public int getId() {
        return Id;
    }

    public void setId(int id) {
        Id = id;
    }

    public String getName() {
        return Name;
    }

    public void setName(String Name) {
        this.Name = Name;
    }
}
ObjectMapper mapper = new ObjectMapper();

mapper.setVisibilityChecker(mapper.getSerializationConfig().getDefaultVisibilityChecker()
            .withFieldVisibility(JsonAutoDetect.Visibility.ANY)
            .withGetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withSetterVisibility(JsonAutoDetect.Visibility.NONE)
            .withCreatorVisibility(JsonAutoDetect.Visibility.NONE));

areaJSON = mapper.writeValueAsString(area);
但此时areaJSON的值如下所示:

{"id":0,"name":"","Name":"","Id":0}
注意具有不同大小写的多个值


我做错了什么?

Jackson认为字段
Id
Name
与getter返回的属性不同,因为大小写不同。使用标准JavaBeans命名约定,Jackson推断与getter对应的字段命名为
id
name
,而不是
id
name

tl;凯斯博士很重要


有两种简单的方法可以解决此问题:

  • 完全从此类中删除
    @JsonAutoDetect
    注释。我非常确定默认注释值优先于
    ObjectMapper
    的配置。或者:

  • 不要乱动
    ObjectMapper
    。将类上的
    @JsonAutoDetect
    更改为

    @JsonAutoDetect(
      fieldVisibility = Visibility.ANY,
      getterVisibility = Visibility.NONE,
      setterVisibility = Visibility.NONE,
      creatorVisibility = Visibility.NONE
    )
    

  • 您需要使用@JsonProperty(“Id”)注释getId方法,否则getId也将添加小写Id。

    我知道这是一篇老文章,但有一个更简单的解决方案: 仅对字段使用注释:

    @XmlRootElement
    @XmlAccessorType(XmlAccessType.FIELD)
    public class Area {
       public int id;
       public String name;
    
       public Area() {
         name = "";
       }
    
       public int getId() {
        return id;
       }
    
       public void setId(int id) {
         id = id;
       }
    
       public String getName() {
         return name;
       }
    
       public void setName(String Name) {
         this.name = Name;
       }
    }
    
    您可以选择序列化对象的方式:使用字段或使用属性。如果使用这些字段,则会忽略getter和setter


    代码中的问题是由第一个大写字母造成的:访问字段时,json属性是Id;访问getter时,getId变成了id(get后的第一个字母用小写编码)。

    我当然同意这种情况很重要,但是jackson不应该因为setter/getter可见性选项集而忽略pojo的getter和setter吗?还值得一提的是,由于其他依赖关系,我的手在变量名方面受到限制。为什么您的字段是公共的?他们为什么使用非传统的套管?Java中的字段名应该是小写的。这是一个很长的故事,我可能需要足够的时间来修复,但与手头的问题并不相关。不过,我完全同意命名应该遵循惯例。看起来不错!时间一到我就接受。值得一提的是,在未经测试的示例中,未找到fieldVisibility,但其余的都可以完美地工作。(当然,我也不需要更改fieldVisibility)。已修复。只是有个打字错误,问得好。感谢您提供准确的