JSON डेटा को जावा ऑब्जेक्ट में परिवर्तित करना


262

मैं अपने जावा एक्शन मेथड में JSON स्ट्रिंग से प्रॉपर्टी एक्सेस करने में सक्षम होना चाहता हूं। स्ट्रिंग केवल कह कर उपलब्ध है myJsonString = object.getJson()। नीचे स्ट्रिंग क्या दिख सकता है, इसका एक उदाहरण है:

{
    'title': 'ComputingandInformationsystems',
    'id': 1,
    'children': 'true',
    'groups': [{
        'title': 'LeveloneCIS',
        'id': 2,
        'children': 'true',
        'groups': [{
            'title': 'IntroToComputingandInternet',
            'id': 3,
            'children': 'false',
            'groups': []
        }]
    }]
}

इस स्ट्रिंग में प्रत्येक JSON ऑब्जेक्ट में अन्य JSON ऑब्जेक्ट्स की एक सरणी होती है। इरादा आईडी की एक सूची निकालने का है जहां किसी भी दिए गए ऑब्जेक्ट में एक समूह संपत्ति है जिसमें अन्य JSON ऑब्जेक्ट हैं। मैंने Google के Gson को संभावित JSON प्लगइन के रूप में देखा। क्या कोई इस तरह का मार्गदर्शन दे सकता है कि मैं इस JSON स्ट्रिंग से जावा कैसे उत्पन्न कर सकता हूं?



यहाँ एक उदाहरण thegeekyland.blogspot.com/2015/11/…
Arlind

जवाबों:


329

मैंने Google के Gson को संभावित JSON प्लगइन के रूप में देखा। क्या कोई इस तरह का मार्गदर्शन दे सकता है कि मैं इस JSON स्ट्रिंग से जावा कैसे उत्पन्न कर सकता हूं?

Google Gson जेनरिक और नेस्टेड बीन्स का समर्थन करता है। []JSON में एक सरणी का प्रतिनिधित्व करता है और इस तरह के रूप में एक जावा संग्रह करने के लिए नक्शे चाहिए Listया सिर्फ एक सादे जावा सरणी। {}JSON में एक वस्तु का प्रतिनिधित्व करता है और एक जावा के लिए नक्शे चाहिए Mapया सिर्फ कुछ JavaBean वर्ग।

आपके पास एक JSON ऑब्जेक्ट है जिसमें कई गुण हैं जो groupsसंपत्ति बहुत समान प्रकार के नेस्टेड ऑब्जेक्ट की एक सरणी का प्रतिनिधित्व करती है। यह Gson के साथ निम्नलिखित तरीके से पार्स किया जा सकता है:

package com.stackoverflow.q1688099;

import java.util.List;
import com.google.gson.Gson;

public class Test {

    public static void main(String... args) throws Exception {
        String json = 
            "{"
                + "'title': 'Computing and Information systems',"
                + "'id' : 1,"
                + "'children' : 'true',"
                + "'groups' : [{"
                    + "'title' : 'Level one CIS',"
                    + "'id' : 2,"
                    + "'children' : 'true',"
                    + "'groups' : [{"
                        + "'title' : 'Intro To Computing and Internet',"
                        + "'id' : 3,"
                        + "'children': 'false',"
                        + "'groups':[]"
                    + "}]" 
                + "}]"
            + "}";

        // Now do the magic.
        Data data = new Gson().fromJson(json, Data.class);

        // Show it.
        System.out.println(data);
    }

}

class Data {
    private String title;
    private Long id;
    private Boolean children;
    private List<Data> groups;

    public String getTitle() { return title; }
    public Long getId() { return id; }
    public Boolean getChildren() { return children; }
    public List<Data> getGroups() { return groups; }

    public void setTitle(String title) { this.title = title; }
    public void setId(Long id) { this.id = id; }
    public void setChildren(Boolean children) { this.children = children; }
    public void setGroups(List<Data> groups) { this.groups = groups; }
    
    public String toString() {
        return String.format("title:%s,id:%d,children:%s,groups:%s", title, id, children, groups);
    }
}

बहुत आसान है, है ना? बस एक उपयुक्त JavaBean और कॉल करें Gson#fromJson()

यह सभी देखें:


4
Performant? क्या आपने वास्तव में इसे मापा है? जबकि GSON के पास उचित सुविधा सेट है, मुझे लगा कि प्रदर्शन कमजोर स्थान ([ cowtowncoder.com/blog/archives/2009/09/entry_326.html] ) के अनुसार था: उदाहरण के लिए: मुझे लगा कि वास्तव में GSON को बसने की जरूरत नहीं है, और खेतों पर आधारित था। इसलिए कोड को थोड़ा सरल बनाया जा सकता है।
स्टेक्समैन

3
मैं इसे एक एंड्रॉइड ऐप में उपयोग करता हूं। यह सबसे तेज़ संभव समाधान नहीं है, लेकिन अब तक उपयोगकर्ता के लिए प्रदर्शन की कमी का औचित्य साबित करने के लिए पर्याप्त सरल है। हो सकता है कि ऐप के बाद के संस्करण में इसे तेज़ समाधान के लिए हटा दिया जाएगा।
Janusz

1
राइट स्पीड, अगर यह काफी तेज है, तो यह काफी तेज है। मैंने सिर्फ अच्छे प्रदर्शन की उम्मीद के संदर्भ में टिप्पणी की। फ़ीचर-सेट वार जैक्सन सभी एक ही घोंसले के शिकार, लेयरिंग, जेनेरिक को संभालता है, इसलिए यह नहीं है कि गति अंतर कहां से आता है। गेटर्स और सेटर होने से किसी भी मापने योग्य तरीके (जैसे पैकेज के बारे में मुझे पता है) में प्रदर्शन को प्रभावित नहीं करता है, इसलिए निश्चित रूप से उन्हें वहाँ हो सकता है।
स्टेक्समैन

97
"पैकेज com.stackoverflow.q1688099;" के लिए +1। किसी कारण से इसने मुझे चकित कर दिया।
गर्गानुचेट

1
सार्वजनिक स्ट्रिंग स्ट्रिंग () {नया Gson लौटाएँ ()। toJson (यह); // प्रत्येक चर लिखने के बजाय इसका उपयोग करें}
प्रकाश

45

Gson के Bewaaaaare! यह बहुत अच्छा है, बहुत शानदार है, लेकिन दूसरा जिसे आप साधारण वस्तुओं के अलावा कुछ भी करना चाहते हैं, आपको आसानी से अपने खुद के धारावाहिकों का निर्माण शुरू करने की आवश्यकता हो सकती है (जो कि कठिन नहीं है )।

इसके अलावा, यदि आपके पास ऑब्जेक्ट्स की एक सरणी है, और आप ऑब्जेक्ट के उस एरेन्स में कुछ जर्सन को डिसेर्बलाइज करते हैं, तो सच्चे टाइप्स LOST हैं! पूर्ण वस्तुओं को भी कॉपी नहीं किया जाएगा! XStream का उपयोग करें .. जो, अगर jsondriver का उपयोग करते हैं और उचित सेटिंग्स सेट करते हैं, तो बदसूरत प्रकारों को वास्तविक json में एन्कोड करेंगे, ताकि आप कुछ भी ढीला न करें। सच्चे क्रमांकन के लिए भुगतान करने के लिए एक छोटी सी कीमत (बदसूरत जोंस)।

ध्यान दें कि जैक्सन इन मुद्दों को ठीक करता है, और जीएसओएन की तुलना में तेज है।


2
मैंने ग्सन का एक कांटा लिखा है जो इन मुद्दों को ठीक करता है (और जैक्सन के सभी एनोटेशन से बचा जाता है): github.com/winterstein/flexi-gson
डैनियल विंटरस्टीन

26

अजीब तरह से, अभी तक उल्लेखित एकमात्र सभ्य JSON प्रोसेसर GSON है।

यहाँ अधिक अच्छे विकल्प हैं:

  • जैक्सन ( गितुब ) - शक्तिशाली डेटा बाइंडिंग (JSON / to POJOs), स्ट्रीमिंग (अल्ट्रा फास्ट), ट्री मॉडल (अनकैप्ड एक्सेस के लिए सुविधाजनक)
  • फ्लेक्स-JSON - अत्यधिक विन्यासनीय सीरीज़

EDIT (अगस्त / 2013):

एक और विचार करने के लिए:

  • गेंसन - जैक्सन के समान कार्यक्षमता, जिसका उद्देश्य डेवलपर द्वारा कॉन्फ़िगर करना आसान है

15

या जैक्सन के साथ:

String json = "...
ObjectMapper m = new ObjectMapper();
Set<Product> products = m.readValue(json, new TypeReference<Set<Product>>() {});

इस दे देंगे त्रुटि नहीं कर सकते START_OBJECT से बाहर टोकन java.util.HashSet की deserialize उदाहरण
दीपेन चावला

7

यदि, किसी परिवर्तन से, आप पहले से ही http://restfb.com/ का उपयोग करते हैं, तो आप ऐसा कर सकते हैं:

import com.restfb.json.JsonObject;

...

JsonObject json = new JsonObject(jsonString);
json.get("title");

आदि।


आपका समाधान छोटा और अधिक समझने योग्य है, यह केवल 3 upvotes क्यों प्राप्त करता है? क्या कुछ गड़बड़ है?
जेफ

4

बदलने के JSONObjectलिए आसान और काम जावा कोडJava Object

Employee.java

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Generated;

import com.fasterxml.jackson.annotation.JsonAnyGetter;
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonPropertyOrder;

@JsonInclude(JsonInclude.Include.NON_NULL)
@Generated("org.jsonschema2pojo")
@JsonPropertyOrder({
"id",
"firstName",
"lastName"
})
public class Employee {

@JsonProperty("id")
private Integer id;
@JsonProperty("firstName")
private String firstName;
@JsonProperty("lastName")
private String lastName;
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();

/**
*
* @return
* The id
*/
@JsonProperty("id")
public Integer getId() {
return id;
}

/**
*
* @param id
* The id
*/
@JsonProperty("id")
public void setId(Integer id) {
this.id = id;
}

/**
*
* @return
* The firstName
*/
@JsonProperty("firstName")
public String getFirstName() {
return firstName;
}

/**
*
* @param firstName
* The firstName
*/
@JsonProperty("firstName")
public void setFirstName(String firstName) {
this.firstName = firstName;
}

/**
*
* @return
* The lastName
*/
@JsonProperty("lastName")
public String getLastName() {
return lastName;
}

/**
*
* @param lastName
* The lastName
*/
@JsonProperty("lastName")
public void setLastName(String lastName) {
this.lastName = lastName;
}

@JsonAnyGetter
public Map<String, Object> getAdditionalProperties() {
return this.additionalProperties;
}

@JsonAnySetter
public void setAdditionalProperty(String name, Object value) {
this.additionalProperties.put(name, value);
}

}

LoadFromJSON.java

import org.codehaus.jettison.json.JSONObject;

import com.fasterxml.jackson.databind.ObjectMapper;

public class LoadFromJSON {

    public static void main(String args[]) throws Exception {
        JSONObject json = new JSONObject();
        json.put("id", 2);
        json.put("firstName", "hello");
        json.put("lastName", "world");

        byte[] jsonData = json.toString().getBytes();

        ObjectMapper mapper = new ObjectMapper();
        Employee employee = mapper.readValue(jsonData, Employee.class);

        System.out.print(employee.getLastName());

    }
}

JSP में इन json गुणों को कैसे एक्सेस करें?
ज़ोरान777

यदि आप JSP पेज में इसका उपयोग नहीं करना चाहते हैं तो कोड अभी भी वही है। कर्मचारी.जावा वर्ग जैसा होगा वैसा ही होगा। लेकिन LoadFromJSON.java में लिखे गए कोड को हर वर्ग के उचित आयात के साथ jsp पृष्ठ में कॉपी किया जाएगा। बाकी कोई बदलाव नहीं है।
राहुल रैना

4
HashMap keyArrayList = new HashMap();
Iterator itr = yourJson.keys();
while (itr.hasNext())
{
    String key = (String) itr.next();
    keyArrayList.put(key, yourJson.get(key).toString());
}

3

यदि आप किसी विशेष प्रकार के मानचित्रों का उपयोग कुंजी या मानों के साथ करते हैं, तो आप पाएंगे कि यह Google के कार्यान्वयन से नहीं लगता है।


2

मानक सामान के साथ क्या गलत है?

JSONObject jsonObject = new JSONObject(someJsonString);
JSONArray jsonArray = jsonObject.getJSONArray("someJsonArray");
String value = jsonArray.optJSONObject(i).getString("someJsonValue");

यह बहुत धीमी गति से है: github.com/fabienrenaud/java-json-benchmark हाल ही में नौकरी पर, मैंने सभी org.json ser / deserialization कॉल को स्विच करने के लिए हमारे ठग सर्वरों के प्रदर्शन (आधा में कटौती कटौती, हाल्ट में विलंबता उपयोग) को दोगुना कर दिया जैक्सन का उपयोग करने के लिए।
फैबियन

0

वरदान दो एक कोशिश:

https://github.com/RichardHightower/boon

यह तेजी से दुष्ट है:

https://github.com/RichardHightower/json-parsers-benchmark

इसके लिए मेरा शब्द न लें ... गैटलिंग बेंचमार्क देखें।

https://github.com/gatling/json-parsers-benchmark

(4x तक कुछ मामले हैं, और परीक्षण के 100s में से। इसमें एक इंडेक्स ओवरले मोड भी है जो और भी तेज है। यह युवा है लेकिन पहले से ही कुछ उपयोगकर्ता हैं।)

यह JSON को मैप्स और सूचियों के लिए तेजी से पार्स कर सकता है और किसी भी अन्य लिबास को JSON DOM को पार्स कर सकता है और वह इंडेक्स ओवरले मोड के बिना है। बून इंडेक्स ओवरले मोड के साथ, यह और भी तेज है।

इसमें बहुत तेज JSON लैक्स मोड और PLIST पार्सर मोड भी है। :) (और एक सुपर कम मेमोरी है, फ्लाई पर UTF-8 एन्कोडिंग के साथ बाइट्स मोड से प्रत्यक्ष)।

इसमें जावाबैन मोड के लिए सबसे तेज JSON भी है।

यह नया है, लेकिन अगर गति और सरल एपीआई वह है जो आप खोज रहे हैं, तो मुझे नहीं लगता कि कोई तेज या अधिक न्यूनतम एपीआई है।


क्या आप नवीनतम संस्करण के लिए दिनांक प्रलेखन के लिए एक लिंक प्रदान कर सकते हैं? आज के रूप में, मुझे 0.4 मिला, लेकिन आसानी से उस संस्करण के लिए एक मिलान डॉक्टर लिंक या ट्यूटोरियल नहीं मिल सकता है। धन्यवाद
Bizmarck

यहाँ एक ट्यूटोरियल है github.com/RichardHightower/boon/wiki/Boon-JSON-in-five-minutes बून सार्वजनिक मावेन रेपो में है। यह 0.27 पर है।
रिक्शे

richardhightower.github.io/site/releases में 0.4 है, इसलिए मैंने सोचा कि यह नवीनतम था। मैं काम पर एक परियोजना के लिए बून बाहर की जाँच कर रहा है, क्या यह जैक्सन के @JsonIgnore के बराबर एनोटेशन है?
बिस्मार्क

वरदान सर् / डिसेरिएलाइज़ेशन प्रदर्शन के निचले छोर पर है: github.com/fabienrenaud/java-json-benchmark प्रदर्शन के लिए जैकसन या डीएसएलजसन चुनें। @ हिचकी: मैं आपके गितुब पर एक मुद्दा नहीं खोल सकता, मैं अपने बेंचमार्क को सुधारने या इसकी व्याख्या को सही करने के लिए तैयार हूं, अगर इसके बारे में कुछ भी गलत / गलत-ए-याद नहीं है।
फैबियन

0

इनपुट के आधार पर JSON प्रारूप (स्ट्रिंग / फ़ाइल) एक jSONString बनाते हैं। JSON से संबंधित नमूना संदेश वर्ग ऑब्जेक्ट नीचे के रूप में प्राप्त किया जा सकता है:

संदेश msgFromJSON = नया ObjectMapper ()। readValue (jSONString, Message.class);


0

सबसे आसान तरीका यह है कि आप इस सॉफ्टकॉनवर्थवे विधि का उपयोग कर सकते हैं जो एक कस्टम विधि है जिसमें आप jsonData को अपने विशिष्ट Dto वर्ग में बदल सकते हैं।

Dto response = softConvertValue(jsonData, Dto.class);


public static <T> T softConvertValue(Object fromValue, Class<T> toValueType) 
{
    ObjectMapper objMapper = new ObjectMapper();
    return objMapper
        .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
        .convertValue(fromValue, toValueType);
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.