গসন: স্ট্রিংটি সরাসরি জসনঅবজেক্টে রূপান্তর করুন (কোনও পজো নেই)


300

এটি বের করার মতো মনে হচ্ছে না। আমি জিএসএন-তে জেএসওন ট্রি ম্যানিপুলেশন চেষ্টা করছি, তবে আমার এমন একটি মামলা রয়েছে যেখানে রূপান্তরিত হওয়ার আগে আমার কাছে স্ট্রিংকে রূপান্তর করতে কোনও POJO জানি না বা নেই 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ব্যর্থ হয়, জেএসএন পালিয়ে যায় এবং JsonStringএকমাত্র হিসাবে বিশ্লেষণ করে bখালি ফিরে আসে JsonObject

কোন ধারনা?


1
: Gson বৈধতা ফাঁদ থেকে সাবধান stackoverflow.com/questions/43233898/...
Vadzim

উত্তর:


525

জসন পার্সার ব্যবহার করুন; উদাহরণ স্বরূপ:

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

17
উগের স্ট্যাটিক 1 লাইনার সুবিধার পদ্ধতি থাকা উচিত
ব্লুন্ডেল

43
জসনঅবজেক্টে কাস্ট করা অপ্রয়োজনীয়, আরও ভাল ব্যবহারnew JsonParser().parse(..).getAsJsonObject();
ক্রিস

1
আমি JsonParser একটি বিমূর্ত ক্লাস হয়
যতীন সেহগল

1
@KevinMeredith আপনি লিঙ্কটি অসম্পূর্ণ, ব্যবহার এই দয়া
নিনজা

4
নোট করুন যে এই পদ্ধতিটি এখন অবচয় করা হয়েছে। ব্যবহার JsonParser.parseString(str).getAsJsonObject()
মাইকেল রাহ্রিগ

147

getAsJsonObject()গ্রহণযোগ্য উত্তরে ব্যবহৃত সরল কাস্টের পরিবর্তে ব্যবহার করার চেষ্টা করুন :

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

2
কোনও কারণে এটি membersপ্যারেন্ট কী দিয়ে মোড়ানো । এখানে একটি নমুনা {"সদস্য": key "কী 1": "13756963814f2c594822982c0307fb81", "কী 2": সত্য, "কী 3": 123456789}
Hossain

1
২.২.৪ এর মতো সর্বশেষতম জিএসএন লাইব্রেরি ব্যবহার করুন। ২.২.২ এর মতো সংস্করণটি কোনও কারণে সদস্যদের ট্যাগ যুক্ত করে।
রুবিন ইয়ু

2
জসন পার্সার ()। পার্স () গসনের নতুন সংস্করণে অবচয় করা হয়েছে। ব্যবহার করুন 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 দ্বারা JSONObject কে অবশ্যই রূপান্তর তালিকা ডেটার জন্য GSON পথ সঙ্গে আমার উত্তর যাচাই করতে পারেন stackoverflow.com/questions/18442452/...
LOG_TAG

3
আমি আপনার উত্তর বৈধ করেছি।
পুরুষোথম

@knoxxs, আপনার মানে JsonObjectশ্রেণীর সংজ্ঞা? এটি গুগলের জিসন লাইব্রেরি থেকে এসেছে। আপনি এখানে ডকুমেন্টেশন উল্লেখ করতে পারেন ।
পুরুষোথম

এটি আমাকে জসনএলিমেন্টের নো-আরগ নির্মাণকারী না থাকার বিষয়ে অভিযোগ করার একটি ত্রুটি দেয়।
ক্ল্যাপস

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 টি অবজেক্টের)।
সাধারণ স্ট্রিংয়ের জন্য যা আগে উপস্থাপন করা হয় তার অনুরূপ পদ্ধতির জন্য জসনঅবজেক্টের আগে জসনআরে প্রথমে রূপান্তর প্রয়োজন।

ক্লায়েন্ট থেকে স্ট্রিং: [{"সম্পত্তি": "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");

উপরে আপনার কী-মান ডেটাটিকে জিএসন অবজেক্টে রূপান্তর করার সহজতম উপায়।
ম্যাডি

1
ধন্যবাদ, আমার ক্ষেত্রে আমার একটি আনসারসড জেএসএন স্ট্রিং ছিল যা থেকে আমার শুরু করা দরকার।
7zark7
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.