Преобразование объектов Java в JSON с Джексоном

166

Я хочу, чтобы мой JSON выглядел так:

{
    "information": [{
        "timestamp": "xxxx",
        "feature": "xxxx",
        "ean": 1234,
        "data": "xxxx"
    }, {
        "timestamp": "yyy",
        "feature": "yyy",
        "ean": 12345,
        "data": "yyy"
    }]
}

Код до сих пор:

import java.util.List;

public class ValueData {

    private List<ValueItems> information;

    public ValueData(){

    }

    public List<ValueItems> getInformation() {
        return information;
    }

    public void setInformation(List<ValueItems> information) {
        this.information = information;
    }

    @Override
    public String toString() {
        return String.format("{information:%s}", information);
    }

}

и

public class ValueItems {

    private String timestamp;
    private String feature;
    private int ean;
    private String data;


    public ValueItems(){

    }

    public ValueItems(String timestamp, String feature, int ean, String data){
        this.timestamp = timestamp;
        this.feature = feature;
        this.ean = ean;
        this.data = data;
    }

    public String getTimestamp() {
        return timestamp;
    }

    public void setTimestamp(String timestamp) {
        this.timestamp = timestamp;
    }

    public String getFeature() {
        return feature;
    }

    public void setFeature(String feature) {
        this.feature = feature;
    }

    public int getEan() {
        return ean;
    }

    public void setEan(int ean) {
        this.ean = ean;
    }

    public String getData() {
        return data;
    }

    public void setData(String data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return String.format("{timestamp:%s,feature:%s,ean:%s,data:%s}", timestamp, feature, ean, data);
    }
}

Мне просто не хватает части, как я могу преобразовать Java-объект в JSON с Джексоном:

public static void main(String[] args) {
   // CONVERT THE JAVA OBJECT TO JSON HERE
    System.out.println(json);
}

Мой вопрос: правильны ли мои занятия? Какой экземпляр мне нужно вызвать и как я могу добиться этого вывода JSON?

JustTheAverageGirl
источник
4
Следующий учебник может помочь: mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
maple_shaft
Спасибо, что помогло мне :)
JustTheAverageGirl
если сущность присоединилась к другим таблицам, следуйте по этому пути. /programming/19928151/convert-entity-object-to-json/45695714#45695714
Седат Y

Ответы:

417

Чтобы конвертировать objectв JSON с Джексоном:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);
Жан Ложар
источник
9
Единственное, что String выходит из ObjectWriter. Используйте: новый JSONObject (ow.writeValueAsString (msg)), если он отправляется через веб-службы, такие как RESTful.
jmarcosSF
Из интереса, почему это не os.writeValueAsJSONString (объект)?
DevilCode
3
Я сталкиваюсь с этой ошибкой, как решить с вашим кодом Не найден сериализатор для класса com.liveprocessor.LPClient.LPTransaction и не найдены свойства для создания BeanSerializer (чтобы избежать исключения, отключите SerializationFeature.FAIL_ON_EMPTY_BEANS)
11
библиотеки кстати: импорт com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter;
Диего Матос - Кеке
objectДОЛЖНЫ иметь геттеры для всех полей, которые вы хотите включить в свой JSON.
Драконовед
25

Я знаю, что это старый (и я новичок в Java), но я столкнулся с той же проблемой. И ответы были не так ясны для меня, как новичок ... поэтому я решил добавить то, что узнал.

Я использовал стороннюю библиотеку, чтобы помочь в работе: org.codehaus.jackson все загрузки для этого можно найти здесь .

Для базовой функциональности JSON вам необходимо добавить следующие jar в библиотеки вашего проекта: jackson-mapper-asl и jackson-core-asl

Выберите версию, в которой нуждается ваш проект. (Обычно вы можете использовать последнюю стабильную сборку).

Как только они будут импортированы в библиотеки вашего проекта, добавьте следующие importстроки в ваш код:

 import org.codehaus.jackson.JsonGenerationException;
 import org.codehaus.jackson.map.JsonMappingException;
 import org.codehaus.jackson.map.ObjectMapper;

С определенным и назначенным объектами java значений, которые вы хотите преобразовать в JSON и вернуть как часть веб-службы RESTful

User u = new User();
u.firstName = "Sample";
u.lastName = "User";
u.email = "sampleU@example.com";

ObjectMapper mapper = new ObjectMapper();

try {
    // convert user object to json string and return it 
    return mapper.writeValueAsString(u);
}
catch (JsonGenerationException | JsonMappingException  e) {
    // catch various errors
    e.printStackTrace();
}

Результат должен выглядеть так: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}

f10orf12
источник
Я считаю, что строки «import» были изменены на «import com.fasterxml.jackson.databind.ObjectMapper;»
barrypicker
16

Это может быть полезно:

objectMapper.writeValue(new File("c:\\employee.json"), employee);

// display to console
Object json = objectMapper.readValue(
     objectMapper.writeValueAsString(employee), Object.class);

System.out.println(objectMapper.writerWithDefaultPrettyPrinter()
     .writeValueAsString(json));
Vicky
источник
10

просто сделай это

 for jackson it's
         ObjectMapper mapper = new ObjectMapper();  
         return mapper.writeValueAsString(object);
         //will return json in string


 for gson it's:
            Gson gson = new Gson();
            return Response.ok(gson.toJson(yourClass)).build();
Shell Скотт
источник
Что такое Response.ok?
Codeversed
У меня была проблема с размерами JSON, вставленными в mongoDB, которые были выше допустимого предела, когда я включаю, мой объект Gson имеет больший размер, чем с Джексоном. Просто совет.
Даниэла Морайс
14
Вопрос о jackson, а неGson
Ean V
2
@Codeversed Response - это класс в библиотеке Джерси. Response.ok вернет JSON-ответ с кодом состояния 200.
Pranav
3

Вы могли бы сделать это:

String json = new ObjectMapper().writeValueAsString(yourObjectHere);
Клейтон К. Н. Пассос
источник
Мне всегда нравятся однорядные ответы.
Кишан Соланки
2

Ну, даже принятый ответ не совсем выдает то, о чем просила опера. Он выводит строку JSON, но с "экранированными символами. Итак, хотя я могу немного опоздать, я отвечаю, надеясь, что это поможет людям! Вот как я это делаю:

StringWriter writer = new StringWriter();
JsonGenerator jgen = new JsonFactory().createGenerator(writer);
jgen.setCodec(new ObjectMapper());
jgen.writeObject(object);
jgen.close();
System.out.println(writer.toString());
Ean V
источник
2

Примечание. Чтобы решение с наибольшим количеством голосов работало, атрибуты в POJO должны быть publicили иметь открытый getter/ setter:

По умолчанию Jackson 2 будет работать только с полями, которые являются либо общедоступными, либо имеют общедоступный метод получения - сериализация сущности, у которой все поля закрыты или пакет закрыт, завершится неудачей.

Еще не проверено, но я считаю, что это правило также применимо к другим библиотекам JSON, таким как Google Gson.

ZhaoGang
источник
0
public class JSONConvector {

    public static String toJSON(Object object) throws JSONException, IllegalAccessException {
        String str = "";
        Class c = object.getClass();
        JSONObject jsonObject = new JSONObject();
        for (Field field : c.getDeclaredFields()) {
            field.setAccessible(true);
            String name = field.getName();
            String value = String.valueOf(field.get(object));
            jsonObject.put(name, value);
        }
        System.out.println(jsonObject.toString());
        return jsonObject.toString();
    }


    public static String toJSON(List list ) throws JSONException, IllegalAccessException {
        JSONArray jsonArray = new JSONArray();
        for (Object i : list) {
            String jstr = toJSON(i);
            JSONObject jsonObject = new JSONObject(jstr);
            jsonArray.put(jsonArray);
        }
        return jsonArray.toString();
    }
}
Артавазд Манукян
источник
Слишком много работы, слишком много размышлений! Предполагается, что картостроители освободят вас от этих типичных вещей!
Ean V
3
Я люблю конвекторы!
Христос
0

Вы можете использовать Google Gson, как это

UserEntity user = new UserEntity();
user.setUserName("UserName");
user.setUserAge(18);

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Ven Ren
источник