【问题标题】:@jsonanygetter doesn't work@jsonanygetter 不起作用
【发布时间】:2015-11-19 08:58:46
【问题描述】:

假设,我有以下课程:

@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ObjectOfMonitoring {
  private BigInteger id;
  private Map<String, Object> properties = new HashMap<>();

  @JsonAnySetter
  public void add(String key, Object value) {
    properties.put(key, value);
  }

  @JsonAnyGetter
  public Map<String, Object> getProperties() {
    return properties;
  }

我在下面的代码中测试它:

ObjectOfMonitoring objectOfMonitoring = new ObjectOfMonitoring();
objectOfMonitoring.setId(BigInteger.ONE);
objectOfMonitoring.add("key1", "value1");
String jsonInString = mapper.writeValueAsString(objectOfMonitoring);
System.out.println(jsonInString);

我想得到结果:

{"id":1,"key2":"value2","key1":"value1"}

但实际结果是:

{"id":1,"properties":{"key2":"value2","key1":"value1"}}

我做错了什么?以及如何得到预期的结果?

【问题讨论】:

  • stackoverflow.com/questions/33797404/… 的可能重复项您只是继续问同样的问题,而忽略了回答前一个问题的努力?
  • @sharonbn 抱歉,我已经解释了为什么我创建了这个问题(实际上是错误的)here。但我仍然不明白为什么这个解决方案(使用@jsonanygetter)不起作用。
  • 这一次我会让别人花时间和精力去调查。

标签: java json jackson


【解决方案1】:

确保ObjectMapper@JsonAnySetter/@JsonAnyGetter 注释来自同一个包。

一切都应该是:

  • 来自org.codehaus.jackson - 这是较旧的 杰克逊的版本
  • 或来自com.fasterxml.jackson - 其中 更新(Jackson 在发布 Jackson 2 时已从 Codehaus 移出 - 见here)

如果您的项目中同时存在这两个依赖项,并且可以互换使用它们,那么您可能会遇到难以注意到的问题。

最好的办法是从您的项目依赖项中删除 org.codehaus.jackson

【讨论】:

    【解决方案2】:

    可能会迟到,但考虑发布答案,因为它可能对将来的某人有所帮助。

    这是您可以为您的班级进行相应配置的示例代码。

    将读取 JSON 并与该类关联的主类:

    public class Main {
    
        public static void main(String[] args) throws Exception {
            File jsonFile = new File("test.json").getAbsoluteFile();
            final ObjectMapper mapper = new ObjectMapper();
            MyObject myObject = mapper.readValue(jsonFile, MyPojo.class);
        }
    }
    

    您的自定义 POJO:

    class MyObject {
    
        private int id;
        private Map<String,String> customField;
        
        //Getter and Setter for POJO fields ommited
    
        @JsonAnySetter
        public void setCustomField(String key, Object value) {
            System.out.println(" Key : " + key + " Value : " + value);
            if(customField == null){
                customField = new HashMap<String,Object>();
            }
            
            customField.put(key,value);
        }
        
        @JsonAnyGetter
        public Map<String,String> getCustomField(){
            return customField;
        }
    }
    

    如果您使用来自ObjectMapperreadValue,即使对于JSON 中的重复键,这也将起作用,但如果您使用来自ObjectMappertreeToValue 方法,那么这对于重复键和您将失败将只有重复字段的最后一个值。我仍在想办法在使用treeToValue 方法时访问重复字段

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      • 2021-04-02
      • 1970-01-01
      • 2016-09-12
      • 1970-01-01
      相关资源
      最近更新 更多