Jackson ObjectMapper - 未映射“_”的属性

时间:2012-03-14 23:01:43

标签: java android json jackson

我在以下情况下使用ObjectMapper,但是,Person类的JSON属性为“last_name”,当“name”属性映射正常时,它似乎没有被映射。我在下面列出了我的Person类。任何可能发生这种情况的原因都值得赞赏。杰克逊核心/映射器1.8.5正在使用。

ObjectNode node = (ObjectNode) row.getDocAsNode();

try {
        Person person = mapper.readValue(node, Person.class);

        tt.setText(person.getName());

        bt.setText(person.getLastName());

    } catch (JsonParseException e) {

        e.printStackTrace();
    } catch (JsonMappingException e) {

        e.printStackTrace();
    } catch (IOException e) {

        e.printStackTrace();
    }

人员类:

@JsonIgnoreProperties(ignoreUnknown = true)

public class Person {

private String _name;
private String _last_name;

public String getName() { return _name; }
public String getLastName() { return _last_name; }

public void setName(String str) { _name = str; }
public void setLastName(String str) { _last_name = str; }

}

2 个答案:

答案 0 :(得分:6)

Java Bean规范定义了预期的映射;因此,使用方法getLastName()意味着只会映射精确属性“lastName”。

要映射“last_name”,您有几个选项:

  • 使用@JsonProperty("last_name")旁边的get方法重命名使用的JSON属性
  • 使用注册了“ObjectMapper.setNamingStrategy()”的PropertyNamingStrategy(如PropertyNamingStrategy. LowerCaseWithUnderscoresStrategy)来更改Bean属性映射JSON名称的方式

如果所有数据都使用与Java Bean命名约定(camel case)不同的命名约定,则Latter方法是有意义的。前者更适合一次性变更。

答案 1 :(得分:0)

我使用了对我有用的@SerializedName(“ attribute_value_with_underscore”)

希望这会有所帮助!

更多详细信息:https://www.javadoc.io/doc/com.google.code.gson/gson/2.6.2/com/google/gson/annotations/SerializedName.html