使用Jackson的ObjectMapper时重复值

时间:2016-03-09 08:57:09

标签: java jackson duplicates

My Bean类如下。映射发生时,JSON对象包含重复值。

响应:

Addresss | Value | Comment
========================
0058     | 2      | argc
0060     | 02100  | argv (value is the memory address of "argv[0]")
...
02100    | 02116 | argv[0] (value is the memory address of "argv[0][0]")
02104    | 02300 | argv[1] (value is the memory address of "argv[1][0]")

...
02116    | '.'   | argv[0][0]
02117    | '/'   | argv[0][1]
02118    | 'm'   | argv[0][2]
02119    | 'y'   | argv[0][3]
02120    | 'p'   | argv[0][4]
02121    | 'r'   | argv[0][5]
02122    | 'o'   | argv[0][6]
02123    | 'g'   | argv[0][7]
02124    | '\0'  | argv[0][8]
...
02300    | 'a'   | argv[1][0]
02301    | 'r'   | argv[1][1]
02302    | 'g'   | argv[1][2]
02303    | '\0'  | argv[1][3]

为什么值会重复?

{"Id":"00PJ0000003mOgMMAU","Name":"web.xml","name":"web.xml","id":"00PJ0000003mOgMMAU"}

2 个答案:

答案 0 :(得分:4)

它不打印两次相同的字段,它会打印出它找到的2个不同的字段。杰克逊认为您要打印teams[0]; // team #1 teams[1]; // team #2 teams[n]; // team #n + 1 ,因为您有一个名为"name"getName()的吸气剂,因为您已使用不同的密钥将"Name"字段注释为Name。它会看到不同的字段,因为@JsonProperty!= "name"。两种解决方案:

  1. 将注释移动到getter。默认情况下会忽略该字段,因为它是私有的。例如

    "Name"
  2. 使用较新版本的Jackson,因为您似乎正在使用@JsonProperty(value = "Name") public String getName() { return Name; } 中的1.8。从那里使用1.9甚至更好地使用com.codehaus中的最新版本。我尝试使用1.9代码,但无需移动注释即可使用。

答案 1 :(得分:0)

在Jackson 2中,尝试禁用所有源(getter,setter,field等)的Jackson可见性,然后仅启用对象字段的可见性:

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;   

...

ObjectMapper mapper = new ObjectMapper();    
mapper.setVisibility(PropertyAccessor.ALL, Visibility.NONE);
mapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY);