От org.json JSONObject до org.codehaus.jackson
Я хочу перейти от org.json
в org.codehaus.jackson
. Как преобразовать следующий код Java?
private JSONObject myJsonMessage(String message){
JSONObject obj = new JSONObject();
obj.put("message",message);
return obj;
}
Я оставил блок try-catch
для простоты.
Ответы
Ответ 1
Вместо JSONObject
используйте Jackson ObjectMapper
и ObjectNode
:
ObjectMapper mapper = new ObjectMapper();
ObjectNode node = mapper.createObjectNode();
node.put("message", "text");
Это будет эквивалент Джексона вашего текущего кода org.json
.
Однако, когда Джексон действительно превосходит, он способен выполнять сложные сопоставления между вашими Java-классами (POJO) и их представлением JSON, а также его потоковым API, который позволяет выполнять действительно быструю сериализацию, по крайней мере, по сравнению с org.json
.
Ответ 2
В Jackson api нет JSONObject
. Вместо того, чтобы возвращать JSONObject
, вы можете либо вернуть Map или Java Bean с свойством message, у которого есть получатели и сеттеры для него.
public class MyMessage {
private String message;
public void setMessage(final String message) {
this.message = message;
}
public String getMessage() {
return this.message;
}
}
Итак, ваш метод будет сведен к:
private MyMessage(String message) {
MyMessage myMessage = new MyMessage();
myMessage.setMessage(message);
return myMessage;
}
Другим аспектом этого изменения будет изменение кода сериализации, чтобы преобразовать MyMessage обратно в строку json. Джексон делает Java Beans, карты по умолчанию, вам не нужно создавать JSONObject
например,
private String serializeMessage(MyMessage message){
//Note: you probably want to put it in a global converter and share the object mapper
ObjectMapper mapper = new ObjectMapper();
return mapper.writeValueAsString(message);
}
Вышеуказанное вернет {message: "some message"}
Я пропустил исключения для краткости.
Ответ 3
Если вы хотите обновить библиотеку org.json
до Jackson
по частям и сначала сохранить тот же API, вам может потребоваться прочитать "" Обновить "org.json в Джексон".
Это, по крайней мере, сделает ваш код примерно в 3 раза быстрее для простого чтения и записи JSON; плюс вы могли бы - если вы так захотите - начнете конвертировать обработку, так как Джексон легко конвертирует между деревьями и POJO (ObjectMapper.treeToValue(...)
, valueToTree
, convertValue
между POJO и т.д. и т.д.).
Просто имейте в виду, что инструменты, с которыми вы знакомы, могут смещать ваше мышление на определенные шаблоны и держать открытый ум, могут помочь вам найти еще лучшие.
В случае с Jackson (или GSON или другими зрелыми Java JSON-инструментами) вы действительно должны учитывать, где может помочь правильная привязка данных, вместо использования JSON-центрированной древовидной модели (которую предлагает org.json). Модели деревьев поддерживают ваше мышление в структуре JSON, что иногда полезно; но также может помешать вам увидеть более естественные шаблоны, которые возникают при определении структуры POJO, чтобы отражать ожидаемый JSON и напрямую работать с объектами Java.