Перетворення об'єктів 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?


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
Sedat Y

Відповіді:


417

Щоб конвертувати ваш objectJSON у Джексона:

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; імпортувати com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke

objectОБОВ'ЯЗКОВО мати вбудовувачі для всіх полів, до яких ви хочете, щоб ваш JSON включав.
Драконовед

25

Я знаю, що це старе (і я новачок у Java), але я зіткнувся з тією ж проблемою. І відповіді були не такі зрозумілі для мене, як для новачків ... тому я думав, що додам те, що дізнався.

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

Для базової функціональності JSON вам потрібно додати наступні банки в бібліотеки вашого проекту: 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"}


Я вважаю, що рядки "імпорту" змінилися на "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));

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();

Що таке Response.ok?
Зашифрований

У мене була проблема з розмірами JSON, вставленими в mongoDB, були вище дозволеної межі, коли я включаю мій об'єкт Gson має більші розміри, ніж у Джексона. Просто порада.
Даніела Морайс

14
Питання про те jackson, чи неGson
Іан V

2
@Codeversed Response - клас у бібліотеці Джерсі. Response.ok поверне відповідь JSON з кодом статусу 200.
Пранав

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());


2

Примітка. Щоб зробити рішення, яке найбільше голосує, атрибути POJO повинні бути publicабо мати загальнодоступні getter/ setter:

За замовчуванням Jackson 2 працюватиме лише з полями, які є або загальнодоступними, або мають публічний метод отримання - серіалізація сутності, у якої всі поля приватні або приватні, пакет не вдасться.

Ще не перевірено, але я вважаю, що це правило застосовується і для інших ліній JSON, таких як Google Gson.


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();
    }
}

Занадто багато роботи, занадто багато роздумів! Картографи повинні звільнити вас від виконання цих речей!
Еан V

3
Я люблю конвектори!
Крістос

0

Ви можете використовувати Google Gson так

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.