كيف أقوم بعرض البيانات بتنسيق JSON من خلال خدمة ويب باستخدام Java؟

StackOverflow https://stackoverflow.com/questions/57689

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك طريقة سهلة لإعادة البيانات إلى عملاء خدمة الويب في JSON باستخدام جافا؟أنا بخير مع servlets والربيع وما إلى ذلك.

هل كانت مفيدة؟

المحلول

إلي، أفضل محلل Java <-> JSON هو XStream (نعم، أنا أتحدث حقًا عن json، وليس عن XML).يتعامل XStream بالفعل مع التبعيات الدائرية ولديه واجهة برمجة تطبيقات بسيطة وقوية حيث يمكنك كتابة برامج التشغيل والمحولات الخاصة بك وما إلى ذلك.

أطيب التحيات

نصائح أخرى

قد يكون من المفيد النظر في جيرسي.تسهل جيرسي الكشف عن خدمات الويب المريحة مثل xml و/أو JSON.

مثال...ابدأ بفصل بسيط

@XmlType(name = "", propOrder = { "id", "text" })
@XmlRootElement(name = "blah")
public class Blah implements Serializable {
    private Integer id;
    private String text;

    public Blah(Integer id, String text) {
        this.id = id;
        this.text = text;
    }    

    @XmlElement
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }

    @XmlElement
    public String getText() { return text; }
    public void setText(String value) { this.text = value; }
}

ثم قم بإنشاء مورد

@Path("/blah")
public class BlahResource {
    private Set<Blah> blahs = new HashSet<Blah>();

    @Context
    private UriInfo context;

    public BlahResource() {
        blahs.add(new Blah(1, "blah the first"));
        blahs.add(new Blah(2, "blah the second"));
    }

    @GET
    @Path("/{id}")
    @ProduceMime({"application/json", "application/xml"})
    public Blah getBlah(@PathParam("id") Integer id) {
        for (Blah blah : blahs) {
            if (blah.getId().equals(id)) {
                return blah;
            }
        }
        throw new NotFoundException("not found");
    }
}

وفضح ذلك.هناك العديد من الطرق للقيام بذلك، مثل استخدام ServletContainer الخاص بجيرسي.(web.xml)

<servlet>
    <servlet-name>jersey</servlet-name>
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>jersey</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

هذا كل ما عليك فعله...افتح متصفحك وتصفح إلى http://localhost/blah/1.افتراضيًا، سترى مخرجات XML.إذا كنت تستخدم FireFox، فقم بتثبيت TamperData وقم بتغيير ملف accept رأس ل application/json لرؤية إخراج JSON.

ومن الواضح أن هناك الكثير لذلك، ولكن جيرسي يجعل كل هذه الأشياء سهلة للغاية.

حظ سعيد!

لقد كنا نستخدم Flexjson لتحويل كائنات Java إلى JSON ووجدنا أنه سهل الاستخدام للغاية.http://flexjson.sourceforge.net

وهنا بعض الأمثلة:

public String searchCars() {
  List<Car> cars = carsService.getCars(manufacturerId);
  return new JSONSerializer().serialize(cars);
}

يحتوي على بعض الميزات الرائعة مثل DeepSerialize لإرسال الرسم البياني بأكمله ولا ينقطع عن العلاقات ثنائية الاتجاه.

new JSONSerializer().deepSerialize(user); 

غالبًا ما يكون تنسيق التواريخ على جانب الخادم مفيدًا أيضًا

new JSONSerializer().transform(
  new DateTransformer("dd/MM/yyyy"),"startDate","endDate"
).serialize(contract);

http://www.json.org/java/index.html لديه ما تحتاجه.

نعم!الدفع json-lib

هنا أ مقتطف رمز مبسط من الكود الخاص بي التي ترسل مجموعة من كائنات المجال الخاص بي:

private String getJsonDocumenent(Object myObj) (
    String result = "oops";
    try {
        JSONArray jsonArray = JSONArray.fromObject(myObj);

        result = jsonArray.toString(2);  //indent = 2

    } catch (net.sf.json.JSONException je) {

        throw je;
    }
    return result;
}

لقد وجدت google-gson مقنعًا.فإنه يتحول إلى JSON والعودة. http://code.google.com/p/google-gson/ إنها مرنة للغاية ويمكنها التعامل مع التعقيدات المتعلقة بالأشياء بطريقة مباشرة.أنا أحب دعمها للأدوية العامة.

/*
* we're looking for results in the form
* {"id":123,"name":thename},{"id":456,"name":theOtherName},...
*
* TypeToken is Gson--allows us to tell Gson the data we're dealing with
* for easier serialization.
*/
Type mapType = new TypeToken<List<Map<String, String>>>(){}.getType();

List<Map<String, String>> resultList = new LinkedList<Map<String, String>>();

for (Map.Entry<String, String> pair : sortedMap.entrySet()) {
    Map<String, String> idNameMap = new HashMap<String, String>();
    idNameMap.put("id", pair.getKey());
    idNameMap.put("name", pair.getValue());
    resultList.add(idNameMap);
}

return (new Gson()).toJson(resultList, mapType);

للحصول على خدمات الويب RESTful في Java، قم أيضًا بمراجعة ريستليت API والذي يوفر تجريدًا قويًا ومرنًا جدًا لخدمات الويب REST (كل من الخادم والعميل، في حاوية أو مستقلة)، ويتكامل أيضًا بشكل جيد مع Spring وJSON.

كما ذكر سلفا، جيرسي (JAX-RS ضمنا) هو الإطار المطلوب استخدامه؛ولكن من أجل التعيين الأساسي لكائنات Java من/إلى JSON، درس تعليمي جيد.على عكس العديد من البدائل، فهو لا يستخدم اصطلاحات توافق XML غريبة ولكنه يقرأ ويكتب JSON نظيفًا يقوم بالتخطيط مباشرة من وإلى الكائنات.كما أنه ليس لديه أي مشاكل مع القيمة الخالية (هناك فرق بين الإدخال المفقود والإدخال الذي يحتوي على قيمة فارغة)، أو القوائم أو السلاسل الفارغة (كلاهما يختلفان عن القيم الخالية).

يعمل Jackson بشكل جيد مع Jersey أيضًا، إما باستخدام جرة موفر JAX-RS، أو حتى يدويًا فقط.وبالمثل، فهو سهل الاستخدام مع السيرفلتس القديمة البسيطة؛ما عليك سوى الحصول على دفق الإدخال/الإخراج، واستدعاء ObjectMapper.readValue() و .writeValue()، وهذا كل ما في الأمر.

لقد كنت أستخدم jaxws-json لتقديم خدمات الويب بتنسيق JSON.يمكنك التحقق من المشروع https://jax-ws-commons.dev.Java.net/json/.

إنه مشروع جميل، بمجرد أن تقوم به، ستكتشف مدى سحره.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top