Gson: स्ट्रिंग को सीधे JsonObject (कोई POJO) में रूपांतरित करें


300

यह पता लगाने के लिए प्रतीत नहीं कर सकते। मैं जीएसओएन में जीएसएन ट्री हेरफेर का प्रयास कर रहा हूं, लेकिन मेरे पास एक ऐसा मामला है जहां मुझे पता नहीं है या एक पीओजेओ को स्ट्रिंग में बदलने के लिए है, जिसे परिवर्तित करने से पहले JsonObject। वहाँ से सीधे जाने के लिए एक रास्ता Stringहै JsonObject?

मैंने निम्नलिखित कोशिश की है (स्काला सिंटैक्स):

val gson = (new GsonBuilder).create

val a: JsonObject = gson.toJsonTree("""{ "a": "A", "b": true }""").getAsJsonObject
val b: JsonObject = gson.fromJson("""{ "a": "A", "b": true }""", classOf[JsonObject])

लेकिन aविफल रहता है, JSON बच जाता है और JsonStringकेवल एक के रूप में पार्स किया जाता है , और bएक खाली लौटाता है JsonObject

कोई विचार?


1
: Gson सत्यापन नुकसान से सावधान रहें stackoverflow.com/questions/43233898/...
वादज़्मी

जवाबों:


525

JsonParser का उपयोग करें; उदाहरण के लिए:

JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{\"a\": \"A\"}").getAsJsonObject();

17
यूजी में एक स्थिर 1 लाइनर सुविधा विधि होनी चाहिए
ब्लंडेल डेन्स

43
कास्ट करने के लिए JsonObject अनावश्यक है, बेहतर उपयोगnew JsonParser().parse(..).getAsJsonObject();
Chriss

1
मुझे लगता है कि JsonParser एक सार वर्ग है
जतिन सहगल

1
@KevinMeredith आप लिंक टूटी हुई है, का उपयोग इस कृपया
निंजा

4
ध्यान दें कि यह विधि अब पदावनत हो गई है। का उपयोग करें JsonParser.parseString(str).getAsJsonObject()
माइकल रोह्रिग

147

getAsJsonObject()स्वीकृत उत्तर में उपयोग किए गए सीधे कलाकारों के बजाय उपयोग करने का प्रयास करें :

JsonObject o = new JsonParser().parse("{\"a\": \"A\"}").getAsJsonObject();

2
किसी कारण के लिए यह membersमूल कुंजी के साथ लपेटता है । यहां एक नमूना है {: { "कुंजी 1": "सदस्यों" "13756963814f2c594822982c0307fb81" "कुंजी 2": सच है, "key3": 123456789}}
हुसैन खान

1
2.2.4 जैसे नवीनतम गन्स लाइब्रेरी का उपयोग करें। २.२.२ जैसा संस्करण किसी कारण से सदस्यों का टैग जोड़ता है।
Rubin Yoo

2
JsonParser ()। Parse () Gson के नए संस्करणों में पदावनत किया गया है। उपयोग करें JsonObject jsonObj = JsonParser.parseString(str).getAsJsonObject()या Gson gson = new Gson(); JsonElement element = gson.fromJson (jsonStr, JsonElement.class); JsonObject jsonObj = element.getAsJsonObject();
जिमी गार्फेल

54
String jsonStr = "{\"a\": \"A\"}";

Gson gson = new Gson();
JsonElement element = gson.fromJson (jsonStr, JsonElement.class);
JsonObject jsonObj = element.getAsJsonObject();

क्या आप मेरे जवाब को जीएसओएन तरीके से परिवर्तित कर सकते हैं ताकि लिस्ट डेटा को gson stackoverflow.com/questions/18442452/-
इन करें

3
मैंने आपके उत्तर को मान्य कर दिया है।
पुरुषोत्तम

@knoxxs, आपका मतलब JsonObjectवर्ग परिभाषा है? यह Google की Gson लाइब्रेरी से आता है। आप यहाँ प्रलेखन का उल्लेख कर सकते हैं ।
पुरुषोत्तम

यह मुझे एक त्रुटि देता है जो JsonElement के बारे में शिकायत करता है कि कोई गैर-आर्ग निर्माता नहीं है।
क्लैप्स

37

सबसे सरल तरीका JsonPrimitiveवर्ग का उपयोग करना है , जो JsonElementनीचे से दिखाया गया है:

JsonElement element = new JsonPrimitive(yourString);
JsonObject result = element.getAsJsonObject();

2
यह सबसे सरल उत्तर है और इससे मुझे मदद मिली। धन्यवाद!
किन्नर

11

बस उसी समस्या का सामना करना पड़ा। आप JsonElementवर्ग के लिए एक तुच्छ कस्टम विवरणक लिख सकते हैं :

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;

GsonBuilder gson_builder = new GsonBuilder();
gson_builder.registerTypeAdapter(
        JsonElement.class,
        new JsonDeserializer<JsonElement>() {
            @Override
            public JsonElement deserialize(JsonElement arg0,
                    Type arg1,
                    JsonDeserializationContext arg2)
                    throws JsonParseException {

                return arg0;
            }
        } );
String str = "{ \"a\": \"A\", \"b\": true }";
Gson gson = gson_builder.create();
JsonElement element = gson.fromJson(str, JsonElement.class);
JsonObject object = element.getAsJsonObject();

4

मेरा मानना ​​है कि यह एक अधिक आसान तरीका है:

public class HibernateProxyTypeAdapter implements JsonSerializer<HibernateProxy>{

    public JsonElement serialize(HibernateProxy object_,
        Type type_,
        JsonSerializationContext context_) {
        return new GsonBuilder().create().toJsonTree(initializeAndUnproxy(object_)).getAsJsonObject();
        // that will convert enum object to its ordinal value and convert it to json element

    }

    public static <T> T initializeAndUnproxy(T entity) {
        if (entity == null) {
            throw new 
               NullPointerException("Entity passed for initialization is null");
        }

        Hibernate.initialize(entity);
        if (entity instanceof HibernateProxy) {
            entity = (T) ((HibernateProxy) entity).getHibernateLazyInitializer()
                    .getImplementation();
        }
        return entity;
    }
}

और तब आप इसे इस तरह से कॉल कर पाएंगे:

Gson gson = new GsonBuilder()
        .registerTypeHierarchyAdapter(HibernateProxy.class, new HibernateProxyTypeAdapter())
        .create();

इस तरह से सभी हाइबरनेट ऑब्जेक्ट अपने आप परिवर्तित हो जाएंगे।


3

JsonParserनिर्माता मान्य नहीं है। इसके बजाय स्थैतिक विधि का उपयोग करें:

JsonObject asJsonObject = JsonParser.parseString(request.schema).getAsJsonObject();

2

EXTJS 4.X में डेटा स्टोर की रिमोट छँटाई के साथ एक परिदृश्य में आया जहाँ स्ट्रिंग को JSON सरणी (केवल 1 ऑब्जेक्ट के रूप में) सर्वर पर भेजा जाता है।
सरल स्ट्रिंग के लिए पहले जो प्रस्तुत किया गया है, उसके समान दृष्टिकोण, बस पहले JsonObject से पहले JsonArray में रूपांतरण की आवश्यकता है।

ग्राहक से स्ट्रिंग: [{"संपत्ति": "COLUMN_NAME", "दिशा": "ASC"}]

String jsonIn = "[{\"property\":\"COLUMN_NAME\",\"direction\":\"ASC\"}]";
JsonArray o = (JsonArray)new JsonParser().parse(jsonIn);

String sortColumn = o.get(0).getAsJsonObject().get("property").getAsString());
String sortDirection = o.get(0).getAsJsonObject().get("direction").getAsString());

1
//import com.google.gson.JsonObject;  
JsonObject complaint = new JsonObject();
complaint.addProperty("key", "value");

ऊपर अपने सबसे महत्वपूर्ण डेटा को gson ऑब्जेक्ट में बदलने का सबसे आसान तरीका है।
मैडी

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