Chuyển đổi các đối tượng Java thành JSON bằng Jackson


166

Tôi muốn JSON của tôi trông như thế này:

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

Mã cho đến nay:

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

Tôi chỉ thiếu phần làm thế nào tôi có thể chuyển đổi đối tượng Java thành JSON bằng Jackson:

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

Câu hỏi của tôi là: Các lớp học của tôi có đúng không? Tôi phải gọi trường hợp nào và làm thế nào để tôi có thể đạt được đầu ra JSON này?



Cảm ơn đã giúp tôi :)
JustTheAlusiveGirl

nếu thực thể tham gia các bảng khác thì hãy làm theo cách này .. /programming/19928151/convert-entity-object-to-json/45695714#45695714
Sedat Y

Câu trả lời:


417

Để chuyển đổi objectJSON của bạn với Jackson:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
String json = ow.writeValueAsString(object);

9
Chỉ có điều là String thoát ra khỏi ObjectWriter. Sử dụng: JSONObject mới (ow.writeValueAsString (tin nhắn)) nếu nó được gửi qua Dịch vụ web như RESTful.
jmarcosSF

Không quan tâm tại sao nó không os.writeValueAsJSONString (đối tượng)?
DevilCode

3
Tôi đang phải đối mặt với lỗi này, làm thế nào để giải quyết với mã Không serializer bạn tìm thấy cho lớp com.liveprocessor.LPClient.LPTransaction và không có tính phát hiện để tạo ra BeanSerializer (để tránh trường hợp ngoại lệ, SerializationFeature.FAIL_ON_EMPTY_BEANS disable))

11
bằng cách này: nhập com.fasterxml.jackson.databind.ObjectMapper; nhập com.fasterxml.jackson.databind.ObjectWriter;
diego matos - keke

objectPHẢI có getters cho tất cả các trường, trong đó bạn muốn JSON của bạn bao gồm.
Drakonond

25

Tôi biết điều này là cũ (và tôi mới sử dụng java), nhưng tôi gặp vấn đề tương tự. Và câu trả lời không rõ ràng với tôi như một người mới ... vì vậy tôi nghĩ tôi sẽ thêm những gì tôi học được.

Tôi đã sử dụng thư viện của bên thứ ba để hỗ trợ trong nỗ lực: org.codehaus.jackson Tất cả các bản tải xuống cho việc này có thể được tìm thấy ở đây .

Đối với chức năng JSON cơ sở, bạn cần thêm các tệp sau vào thư viện của dự án: jackson-mapper-asljackson-core-asl

Chọn phiên bản mà dự án của bạn cần. (Thông thường bạn có thể đi với bản dựng ổn định mới nhất).

Khi chúng được nhập vào thư viện của dự án, hãy thêm các importdòng sau vào mã của bạn:

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

Với đối tượng java được xác định và gán các giá trị mà bạn muốn chuyển đổi thành JSON và trả về như một phần của dịch vụ web 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();
}

Kết quả sẽ như thế này: {"firstName":"Sample","lastName":"User","email":"sampleU@example.com"}


Tôi tin rằng các dòng 'nhập' đã thay đổi thành "nhập com.fasterxml.jackson.databind.ObjectMapper;"
barrypicker

16

Điều này có thể hữu ích:

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

chỉ làm điều này

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

Phản hồi là gì?
Được mã hóa vào

Tôi gặp vấn đề với kích thước JSON được chèn vào mongoDB vượt quá giới hạn cho phép, khi tôi bật đối tượng Gson của tôi có kích thước lớn hơn so với Jackson. Chỉ là một mẹo.
Daniela Morais

14
Câu hỏi là về jackson, không phảiGson
Ean V

2
@Codeversed Phản hồi là một lớp trong thư viện Jersey. Feedback.ok sẽ trả về phản hồi JSON với mã trạng thái 200.
Pranav

2

Chà, ngay cả câu trả lời được chấp nhận cũng không đưa ra chính xác những gì op đã yêu cầu. Nó xuất ra chuỗi JSON nhưng có "ký tự thoát. Vì vậy, mặc dù có thể hơi muộn, tôi đang trả lời với hy vọng nó sẽ giúp được mọi người! Đây là cách tôi làm điều đó:

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

Lưu ý: Để làm cho giải pháp được bình chọn nhiều nhất hoạt động, các thuộc tính trong POJO phải publichoặc có công khai getter/ setter:

Theo mặc định, Jackson 2 sẽ chỉ hoạt động với các trường là công khai hoặc có phương thức getter công khai - tuần tự hóa một thực thể có tất cả các trường riêng tư hoặc gói riêng tư sẽ thất bại.

Chưa được thử nghiệm, nhưng tôi tin rằng quy tắc này cũng áp dụng cho các lib JSON khác như 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();
    }
}

Quá nhiều công việc, quá nhiều suy ngẫm! Mappers được cho là để giải phóng bạn làm những thứ nồi hơi này!
Ean V

3
Tôi yêu Convector!
Christos

0

Bạn có thể sử dụng Google Gson như thế này

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.