От 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.