การแปลงอ็อบเจ็กต์ Java เป็น JSON ด้วย Jackson


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

ในการแปลงของคุณobjectใน JSON ด้วย Jackson:

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

9
สิ่งเดียวที่ทำให้ String ออกมาจาก ObjectWriter ใช้: JSONObject ใหม่ (ow.writeValueAsString (msg)) หากมีการส่งออกผ่านบริการทางเว็บเช่น RESTful
jmarcosSF

ทำไมจึงไม่เป็น os.writeValueAsJSONString (วัตถุ)
DevilCode

3
ฉันหันหน้าไปทางข้อผิดพลาดนี้วิธีการแก้ปัญหาที่มีรหัสไม่มี serializer คุณพบ 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 ของคุณประกอบด้วย
Drakonoved

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 คืออะไร
codeversed

ฉันมีปัญหากับขนาด JSON ที่แทรกลงใน mongoDB นั้นเกินขีด จำกัด ที่อนุญาตเมื่อฉันเปิดวัตถุ Gson ของฉันมีขนาดใหญ่กว่ากับแจ็คสัน เพียงแค่ปลาย
Daniela Morais

14
คำถามเกี่ยวกับjacksonไม่ใช่Gson
Ean V

2
@Ceveversed Response เป็นคลาสในห้องสมุด Jersey Response.ok จะส่งคืนการตอบสนองของ JSON พร้อมรหัสสถานะ 200
Pranav


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 จะทำงานเฉพาะกับเขตข้อมูลที่เป็นสาธารณะหรือมีวิธีการทะเยอทะยานสาธารณะ - การทำให้เป็นอันดับของเอนทิตีที่มีฟิลด์ทั้งหมดเป็นส่วนตัวหรือแพคเกจส่วนตัวจะล้มเหลว

ยังไม่ได้ทดสอบ แต่ฉันเชื่อว่ากฎนี้ใช้กับ libs 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();
    }
}

ทำงานมากเกินไปสะท้อนมากเกินไป! ผู้ทำแผนที่ควรจะปล่อยให้คุณทำสิ่งสำเร็จรูปเหล่านี้!
Ean V

3
ฉันรักนักคอนเวอเรจ!
Christos

0

คุณสามารถใช้ Google Gson เช่นนี้

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

Gson gson = new Gson();
String jsonStr = gson.toJson(user);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.