जैक्सन के ऑब्जेक्टमैपर का उपयोग करके JSON ऑब्जेक्ट्स का ऑर्डर


92

मैं अपने जावा-जोंस मैपिंग करने के लिए ObjectMapper का उपयोग कर रहा हूं ।

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
ow.writeValue(new File( fileName +".json"), jsonObj);

यह मेरा जावा क्लास है:

public class Relation {

private String id;
private String source;
private String target;
private String label;
private List<RelAttribute> attributes;

public String getId() {
    return id;
}

public void setId(String id) {
    this.id = id;
}

public String getSource() {
    return source;
}

public void setSource(String source) {
    this.source = source;
}

public String getTarget() {
    return target;
}

public void setTarget(String target) {
    this.target = target;
}

public String getLabel() {
    return label;
}
public void setLabel(String label) {
    this.label = label;
}

public void setAttributes(List<RelAttribute> attributes) {
    this.attributes = attributes;
}

public List<RelAttribute> getAttributes() {
    return attributes;
}

}

यह वही है जो मुझे मिलता है:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ],
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0"
  }

तो मेरा सवाल अब है, मैं कैसे इस उत्पादन को प्राप्त कर सकते हैं:

{
    "id" : "-75da69d3-79c8-4000-a3d8-b10350a57a7e",
    "label" : "new Label",
    "target" : "-46b238ac-b8b3-4230-b32c-be9707f8b691",
    "source" : "-daa34638-061a-45e0-9f2e-35afd6c271e0",
    "attributes" : [ {
      "attrName" : "ID",
      "attrValue" : ""
    }, {
      "attrName" : "Description",
      "attrValue" : "Primary Actor"
    }, {
      "attrName" : "Status",
      "attrValue" : ""
    } ]

  }

मैं इसे अपने जावा घोषणा पत्र में उसी क्रम से चाहता हूं। क्या इसे निर्दिष्ट करने का कोई तरीका है? हो सकता है कि एनोटेशन या सामान के साथ ऐसा हो?


2
संपत्ति आदेश एक कोड / डिजाइन गंध के लिए महत्वपूर्ण बिंदु हैं। जो कुछ भी JSON का उपभोग कर रहा है उसे ऑर्डर के बारे में परवाह नहीं करनी चाहिए (हां, गुण नहीं)।
ACH

25
मुझे सिर्फ पठनीयता के लिए इसकी आवश्यकता है :-)
justSaid

11
@ यह सच नहीं है। एक ऑर्डर किया गया नक्शा एक बहुत ही सामान्य और बहुत उपयोगी, डेटा प्रकार है। इच्छा आदेश बिल्कुल भी गंध नहीं है।
बकरी

जवाबों:



5

क्या आप जानते हैं कि अल्फाबेटिक ऑर्डर को निर्दिष्ट करने का एक सुविधाजनक तरीका है?

@JsonPropertyOrder(alphabetic = true)
public class Relation { ... }

यदि आपके पास विशिष्ट आवश्यकताएं हैं, तो यहां आप कस्टम ऑर्डरिंग को कैसे कॉन्फ़िगर करते हैं:

@JsonPropertyOrder({ "id", "label", "target", "source", "attributes" })
public class Relation { ... }

3

आप उपयोग कर सकते हैं @XmlAccessorType(XmlAccessType.FIELD)

@XmlType(name = "response", propOrder = { "prop1", "prop2",
        "prop3", "prop4", "prop5", "prop6" }).

@JsonPropertyOrder एक नया जार जोड़ा जाना चाहिए।


3
@JsonPropertyOrder को नए जार की आवश्यकता नहीं है क्योंकि यदि आप जैक्सन का उपयोग करते हैं तो यह पहले से ही शामिल है।
पैट्रिक

1
यह उस रूपरेखा पर निर्भर करता है जिसका आप उपयोग कर रहे हैं। यदि आप जैकसन का उपयोग नहीं करते हैं, तो इसके बाद के कार्यान्वयन के साथ जाना बेहतर होगा जो कि json और xml दोनों के लिए लागू होगा और यदि आपको xml प्रारूप में डेटा वापस करना है तो कोई अतिरिक्त कॉन्फ़िगरेशन की आवश्यकता नहीं है
user1001

हां, लेकिन जैकसन का उपयोग करके सवाल पूछा गया था। यदि आप जैकसन का उपयोग किए बिना एक समाधान प्रदान करना चाहते हैं, तो आपको अपने उत्तर में अधिक अलग होना होगा।
पैट्रिक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.