Джексон против Гссона для простой десериализации

1 markdsievers [2011-09-25 04:19:00]

Для разбора JSON, как этот users/show API-интерфейса Twitter users/show ответ, я использовал библиотеки Jackson и Gson Java в качестве кандидатов для выполнения этой работы. Меня интересует только небольшое подмножество свойств JSON, поэтому Гсн был хорош из-за его очень сжатого синтаксиса, но я теряю внутреннюю битву, чтобы продолжать использовать Gson, поскольку Джексон уже используется в другом месте нашего приложения, и он документировал лучшая производительность (которую я признаю, являются и хорошими причинами, чтобы потерять Gson).

Для POJO

public class TwitterUser {
private String id_str;
private String screen_name;

public String getId_str() {
    return id_str;
}

public void setId_str(String id_str) {
    this.id_str = id_str;
}

public String getScreen_name() {
    return screen_name;
}

public void setScreen_name(String screen_name) {
    this.screen_name = screen_name;
}
}

Единственный код для Gson, который нужно было построить, это одна строка,

TwitterUser user = new Gson().fromJson(jsonStr, TwitterUser.class);

Это очень мило для меня; хорошо масштабируется и выбирает нужные свойства. С другой стороны, Джексон немного более трудоемкий для создания POJO из выбранных полей.

Map<String,Object> userData = new ObjectMapper().readValue(jsonStr, Map.class);
//then build TwitterUser manually

или

TwitterUser user = new ObjectMapper().readValue(jsonStr, TwitterUser.class);
//each unused property must be marked as ignorable. Yikes! For 30 odd ignored fields thats too much configuration.

Итак, после этого длинного объяснения, есть ли способ использовать Джексона с меньшим количеством кода, чем показано выше?

java json jackson gson


1 ответ


4 Решение Matt Ball [2011-09-25 04:25:00]

С помощью Jackson 1. 4+ вы можете использовать аннотацию @JsonIgnoreProperties уровне @JsonIgnoreProperties чтобы молча игнорировать неизвестные поля, а ignoreUnknown - true.

@JsonIgnoreProperties(ignoreUnknown = true)
public class TwitterUser {
    // snip...
}