Джексон против Гсона для простой десериализации - PullRequest
1 голос
/ 25 сентября 2011

Для синтаксического анализа JSON, например этого твиттер-API users/show ответ Я использовал библиотеки Java Джексона и Джсона в качестве кандидатов для выполнения этой работы.Меня интересует только небольшое подмножество свойств JSON, поэтому Gson был хорош из-за его очень лаконичного синтаксиса, но я проигрываю внутреннюю битву за то, чтобы продолжать использовать 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.

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

1 Ответ

4 голосов
/ 25 сентября 2011

С Jackson 1.4+ вы можете использовать аннотацию на уровне класса @JsonIgnoreProperties для скрытого игнорирования неизвестных полей с ignoreUnknown, установленным в true.

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