Helpex - Trao đổi & giúp đỡ Đăng nhập
30

Tôi có một biểu đồ đối tượng mà tôi muốn chuyển đổi sang và từ JSON và XML, nhằm mục đích tạo một API kiểu REST. Tôi ngạc nhiên rằng ai đó chắc chắn đã làm điều này rồi, nhưng một tìm kiếm nhanh bằng Google và Stack Overflow không cho thấy điều gì.

Có ai biết về một thư viện phù hợp (Apache hoặc giấy phép tương đương được ưu tiên) để thực hiện việc này không?

30 hữu ích 2 bình luận 38k xem chia sẻ
10 trả lời 10
14

GSON từ google: http://code.google.com/p/google-gson/ ,

hoặc là

Jackson thư viện được sử dụng vào mùa xuân: https://github.com/FasterXML/jackson

và tôi sẽ đồng tình với những người khác đề xuất jaxb cho XML để phát triển, được hỗ trợ tốt rất nhiều công cụ: nó là tiêu chuẩn.

14 hữu ích 2 bình luận chia sẻ
11

Đối với POJO sang XML, tôi khuyên bạn nên sử dụng JAXB (cũng có các thư viện khác, chẳng hạn như XStream chẳng hạn, nhưng JAXB được chuẩn hóa).

Đối với JSON, tôi không biết gì, nhưng nếu bạn muốn triển khai API RESTful, bạn có thể quan tâm đến JSR-311 , định nghĩa API phía máy chủ cho các API RESTful và Jersey , là triển khai tham chiếu của nó.

11 hữu ích 1 bình luận chia sẻ
6

Sử dụng Xstream http://x-stream.github.io/ cho xml và JSON http://www.json.org/java/ cho JSON. Tôi không nghĩ rằng có một thư viện làm được cả hai điều đó.

Hoặc viết một trình bao bọc ủy quyền cho trình kết xuất XStream / trình kết xuất JSON tùy thuộc vào những gì bạn muốn.

6 hữu ích 2 bình luận chia sẻ
3

Tôi nghĩ rằng bạn có thể đang tìm kiếm thứ gì đó tương tự như ở đây: Phần Java JSON.org

3 hữu ích 2 bình luận chia sẻ
3

Lưu ý: Tôi là trưởng nhóm EclipseLink JAXB (MOXy) và là thành viên của nhóm chuyên gia JAXB (JSR-222) .

EclipseLink JAXB (MOXy) hỗ trợ ánh xạ một mô hình đối tượng đơn lẻ sang cả XML và JSON với cùng một siêu dữ liệu:

Thông tin giấy phép


MÔ HÌNH MIỀN

Dưới đây là mô hình miền mà chúng tôi sẽ sử dụng cho ví dụ này. Đối với ví dụ này, tôi chỉ sử dụng các chú thích JAXB (JSR-222) tiêu chuẩn có sẵn trong JDK / JRE kể từ Java SE 6.

khách hàng

package forum658936;

import java.util.List;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class Customer {

    String firstName;

    @XmlElement(nillable=true)
    String lastName;

    @XmlElement(name="phone-number")
    List<PhoneNumber> phoneNumbers;

}

Số điện thoại

package forum658936;

import javax.xml.bind.annotation.*;

@XmlAccessorType(XmlAccessType.FIELD)
public class PhoneNumber {

    @XmlAttribute
    int id;

    @XmlValue
    String number;

}

jaxb.properties

Để chỉ định MOXy làm nhà cung cấp JAXB của bạn, bạn cần bao gồm một tệp được gọi jaxb.propertiestrong cùng một gói với mô hình miền của bạn với mục nhập sau (xem: http://blog.bdoughan.com/2011/05/specify-eclipselink-moxy-as -your.html ).

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory

XML

input.xml

Đây là XML mà mã demo của chúng tôi sẽ đọc và chuyển đổi thành các đối tượng miền.

<?xml version="1.0" encoding="UTF-8"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <firstName>Jane</firstName>
    <lastName xsi:nil="true"/>
    <phone-number id="123">555-1234</phone-number>
</customer>

Những điều cần lưu ý về XML:


JSON

Đầu ra

Dưới đây là JSON được xuất ra bằng cách chạy mã demo.

{
   "firstName" : "Jane",
   "lastName" : null,
   "phone-number" : [ {
      "id" : 123,
      "value" : "555-1234"
   } ]
}

Những điều cần lưu ý về JSON:

  • Các nullgiá trị được sử dụng để đại diện cho rằng lastNamelà null. Không có sự hiện diện của xsi:nilthuộc tính.
  • Bộ sưu tập số điện thoại có kích thước 1 và được ràng buộc chính xác bằng dấu ngoặc vuông. Nhiều thư viện coi các bộ sưu tập có kích thước 1 là đối tượng JSON một cách không chính xác.
  • Các propertyloại intđược marshalled một cách chính xác mà không có dấu ngoặc kép.
  • Trong biểu diễn XML idlà một thuộc tính, nhưng trong biểu diễn JSON không cần nó phải được biểu diễn đặc biệt.

MÃ DEMO

Trong đoạn mã demo bên dưới, chúng tôi sẽ chuyển đổi một tài liệu XML thành các đối tượng, và sau đó chuyển đổi các phiên bản tương tự đó thành JSON.

Bản giới thiệu

MOXy không chỉ diễn giải các chú thích JAXB mà nó còn là một triển khai JAXB để các API thời gian chạy JAXB tiêu chuẩn được sử dụng. Liên kết JSON được kích hoạt bằng cách chỉ định các thuộc tính chỉ định MOXy trên Marshaller.

package forum658936;

import java.io.File;
import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Customer.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum658936/input.xml");
        Customer customer = (Customer) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.setProperty(MarshallerProperties.MEDIA_TYPE, "application/json");
        marshaller.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
        marshaller.marshal(customer, System.out);
    }

}
3 hữu ích 1 bình luận chia sẻ
1

Json-lib được cấp phép theo giấy phép Apache 2.0.

Nó cũng có thể chuyển đổi các đối tượng JSON sang XML, nhưng trước tiên bạn cần phải chuyển đổi các POJO của mình sang JSON.

1 hữu ích 1 bình luận chia sẻ
1

Cá nhân tôi sẽ giải quyết hai điều này một cách riêng biệt; và chuyển đổi JSON <-> XML qua JSON <-> Pojo <-> XML.

Với điều đó: Java <-> POJO với JAXB ( http://jaxb.dev.java.net ; cũng được đóng gói với JDK 1.6) với chú thích (XStream cũng được); và đối với JSON, ObjectMapper của Jackson ( http://jackson.codehaus.org/Tutorial ). Hoạt động tốt với Jersey và tôi đang sử dụng nó (phiên bản Jersey hiện tại không gói dữ liệu Pojo đầy đủ ràng buộc theo mặc định, nhưng sẽ có trong tương lai gần)

Tôi thực sự sẽ không sử dụng bất kỳ lib xml nào để tạo ra "json": XStream và JAXB / Jettison có thể tạo ra loại JSON, nhưng nó sử dụng các quy ước xấu xí và không trực quan.

EDIT (18-Jul-2011): Jackson thực sự có một phần mở rộng được gọi là " jackson-xml-databind " có thể đọc / ghi XML, tương tự như JAXB. Vì vậy, nó có thể được sử dụng cho cả JSON và XML, đến / từ các POJO.

1 hữu ích 0 bình luận chia sẻ
0

Lần cuối tôi thấy trên trang web, XStream sẽ làm cả hai. Nó hỗ trợ XML và JSON làm mục tiêu tuần tự hóa.

0 hữu ích 0 bình luận chia sẻ
0

Gần như có hàng trăm. Mục yêu thích của tôi là GSON cho POJO <-> JSON và castor-xml cho POJO <-> XML.

Như một phần thưởng, cả hai đều được cấp phép theo giấy phép kiểu Apache License 2.0.

0 hữu ích 0 bình luận chia sẻ
-1

Hãy xem thư viện Genson http://code.google.com/p/genson/wiki/GettingStarted .

Nó rất dễ sử dụng, hiệu quả và được thiết kế với tính năng mở rộng. Trên thực tế, nó thực hiện chuyển đổi json / java nhưng không phải xml. Tuy nhiên, hỗ trợ xml có thể được thêm vào trong một phiên bản trong tương lai.

Tôi đang sử dụng nó trong các ứng dụng web và dịch vụ web REST ở dạng jersey, nhưng cũng có thể trong một số trường hợp để lưu trữ các đối tượng ở dạng json của chúng vào cơ sở dữ liệu.

Ah và nó theo giấy phép Apache 2.0.

-1 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ java xml json pojo , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading