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 অবজেক্ট ধারণ করে এমন কোনও গোষ্ঠী সম্পত্তি সম্বলিত কোনও প্রদত্ত বস্তু। আমি গুগলের জিসনকে একটি সম্ভাব্য জেএসএন প্লাগইন হিসাবে দেখেছি। আমি কীভাবে এই জেএসএন স্ট্রিং থেকে জাভা তৈরি করতে পারি সে সম্পর্কে কেউ কোনও নির্দেশিকার কিছু ফর্ম সরবরাহ করতে পারে?


এছাড়াও দেখুন
স্ট্যাকওভারফ্লো.

এখানে একটি উদাহরণ রয়েছে thegeekyland.blogspot.com/2015/11/…
আর্লিন্ড

উত্তর:


329

আমি গুগলের জিসনকে একটি সম্ভাব্য জেএসএন প্লাগইন হিসাবে দেখেছি। আমি কীভাবে এই জেএসএন স্ট্রিং থেকে জাভা তৈরি করতে পারি সে সম্পর্কে কেউ কোনও নির্দেশিকার কিছু ফর্ম সরবরাহ করতে পারে?

গুগল গসন জেনারিকস এবং নেস্টেড মটরশুটি সমর্থন করে। []তাদেরকে JSON মধ্যে একটি অ্যারের প্রতিনিধিত্ব করে এবং যেমন একটি জাভা সংগ্রহ ম্যাপ উচিত Listবা শুধু একটি প্লেইন জাভা অ্যারে। {}তাদেরকে JSON মধ্যে একটি বস্তুর উপস্থাপন করে এবং একটি জাভা ম্যাপ উচিত Mapবা শুধু কিছু জাভা বিন বর্গ।

আপনার কাছে বেশ কয়েকটি বৈশিষ্ট্যের সাথে একটি জেএসওএন অবজেক্ট রয়েছে যার groupsসম্পত্তি খুব একই ধরণের নেস্টেড অবজেক্টের অ্যারে উপস্থাপন করে। এটি নিম্নলিখিত উপায়ে গসনের সাথে বিশ্লেষণ করা যায়:

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);
    }
}

মোটামুটি সহজ, তাই না? কেবলমাত্র একটি উপযুক্ত জাভাবিয়ান এবং কল করুন Gson#fromJson()

আরো দেখুন:


4
Performant? আপনি কি আসলে এটি পরিমাপ করেছেন? GSON এর যুক্তিসঙ্গত বৈশিষ্ট্য সেট থাকা অবস্থায়, আমি ভেবেছিলাম পারফরম্যান্সটি একদম দুর্বল স্পট ছিল ([ কাটাটাউনকোডার / ব্লগ / আর্কাইভস / ২০০৯ / 09 / entry_326.html] অনুসারে ) ক্ষেত্র উপর ভিত্তি করে ছিল। সুতরাং কোড কিছুটা সরল করা যায়।
স্ট্যাক্সমান

3
আমি এটি একটি অ্যান্ড্রয়েড অ্যাপে ব্যবহার করি। এটি দ্রুততম সমাধান হতে পারে না তবে এটি এখন পর্যন্ত ব্যবহারকারীর জন্য পারফরম্যান্সের অভাবকে ন্যায়সঙ্গত করার জন্য প্রোগ্রাম করা যথেষ্ট সহজ। সম্ভবত অ্যাপ্লিকেশনটির পরবর্তী সংস্করণে এটি একটি দ্রুত সমাধানের জন্য সরানো হবে।
জানুশ

1
Wrt গতি, এটি যথেষ্ট দ্রুত, এটি যথেষ্ট দ্রুত। আমি কেবল প্রত্যাশিত ভাল পারফরম্যান্সের রেফারেন্সে মন্তব্য করেছি। বৈশিষ্ট্য-নির্ধারণযুক্ত জ্যাকসন একই বাসা, লেয়ারিং, জেনেরিকগুলি পরিচালনা করেন, তাই গতির পার্থক্যটি এখান থেকে আসে না। গিটারস এবং সেটটারগুলি কোনও পরিমাপযোগ্য উপায়ে পারফরম্যান্সকে প্রভাবিত করে না (প্যাকেজগুলির জন্য যা আমি সচেতন) সুতরাং অবশ্যই সেগুলি সেখানে থাকতে পারে।
স্টেক্সম্যান

97
"প্যাকেজ com.stackoverflow.q1688099;" এর জন্য +1। কিছু কারণে এটি আমাকে ছোটাছুটি করেছে।
গারগান্টুচেট

1
পাবলিক স্ট্রিং টু স্ট্রিং () new নতুন গসন () ফেরান to // প্রতিটি পরিবর্তনশীল লেখার পরিবর্তে এটি ব্যবহার করুন
Prakash

45

গসনের বেওয়াআরে! এটা অনেক ঠাণ্ডা, নিরতিশয় কিন্তু দ্বিতীয় আপনাকে সহজ বস্তু ছাড়া অন্য কিছু করতে চান, আপনি সহজেই আপনার নিজের serializers (যা নয় বিল্ডিং শুরু করতে পারে যে হার্ড)।

এছাড়াও, যদি আপনার অবজেক্টগুলির একটি অ্যারে থাকে এবং আপনি কিছু জসনকে সেই অবজেক্টের অ্যারেটিতে ডিসরিয়ালাইজ করেন তবে সত্যিকারের ধরনগুলি হ'ল লস্ট! সম্পূর্ণ বস্তু এমনকি অনুলিপি করা হবে না! এক্সস্ট্রিম ব্যবহার করুন .. যা, যদি jsondriver ব্যবহার করে এবং যথাযথ সেটিংস সেট করে রাখে তবে কুৎসিত প্রকারগুলিকে আসল জসনটিতে এনকোড করা হবে, যাতে আপনার কোনও কিছুই আলগা না হয়। সত্য সিরিয়ালাইজেশনের জন্য মূল্য দিতে (কুৎসিত জসন) একটি ছোট মূল্য।

নোট করুন যে জ্যাকসন এই সমস্যাগুলি সমাধান করে এবং জিএসওনের চেয়ে দ্রুত


2
আমি গসনের একটি কাঁটাচামচ লিখেছি যা এই সমস্যাগুলিকে সংশোধন করে (এবং জ্যাকসনের সমস্ত মন্তব্যগুলি এড়িয়ে যায়): github.com/winterstein/flexi-gson
ড্যানিয়েল উইন্টারস্টেইন

26

অদ্ভুতভাবে, এখনও অবধি উল্লেখ করা একমাত্র শালীন JSON প্রসেসর হ'ল জিএসএন।

এখানে আরও ভাল পছন্দ রয়েছে:

  • জ্যাকসন ( গিথুব ) - শক্তিশালী ডেটা বাঁধাই (জেএসএন থেকে POJOs থেকে), স্ট্রিমিং (অতি দ্রুত), ট্রি মডেল (টাইপযুক্ত অ্যাক্সেসের জন্য সুবিধাজনক)
  • ফ্লেক্স-জেএসএন - অত্যন্ত কনফিগারযোগ্য সিরিয়ালাইজেশন

সম্পাদনা (আগস্ট / 2013):

আরও একটি বিষয় বিবেচনা করুন:

  • জেনসন - জ্যাকসনের অনুরূপ কার্যকারিতা, বিকাশকারী দ্বারা কনফিগার করা সহজ হওয়ার লক্ষ্য

15

বা জ্যাকসনের সাথে:

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

এই দেব ত্রুটি পারেন না START_OBJECT বাইরে টোকেন java.util.HashSet এর deserialize উদাহরণস্বরূপ
Dipen চাওলা

7

যদি কোনও পরিবর্তন করে আপনি ইতিমধ্যে http://restfb.com/ ব্যবহার করে এমন একটি অ্যাপ্লিকেশনটিতে থাকেন তবে আপনি এটি করতে পারেন:

import com.restfb.json.JsonObject;

...

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

প্রভৃতি


আপনার সমাধানটি সংক্ষিপ্ততর এবং আরও বোধগম্য, কেন এটি কেবল 3 টি আপভোট গ্রহণ করে? কোন সমস্যা?
জেফ

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());

    }
}

জেএসপিতে এই জসন বৈশিষ্ট্যগুলি কীভাবে অ্যাক্সেস করবেন?
জোড়ান 777

আপনি যদি এটি JSP পৃষ্ঠায় ব্যবহার করতে না চান তবে কোডটি এখনও একই the কর্মচারী.জভা শ্রেণি যেমন হবে তেমন থাকবে। তবে 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

আপনি যদি বিশেষ মানচিত্রের কী বা মান সহ কোনও ধরণের বিশেষ মানচিত্র ব্যবহার করেন তবে আপনি দেখতে পাবেন যে এটি গুগল বাস্তবায়নের দ্বারা চিন্তিত নয়।


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 সার্ভার / ডিসিরিয়ালাইজেশন কলগুলি স্যুইচ করে আমাদের প্রোড সার্ভারের পারফরম্যান্স (অর্ধেক অংশে সিপু ব্যবহারের কাটা, বিলম্বিত কাটা) দ্বিগুণ করেছি জ্যাকসন ব্যবহার করতে।
ফেবিয়ান

0

একবার চেষ্টা করুন:

https://github.com/RichardHightower/boon

এটা মন্দ দ্রুত:

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

আমার শব্দটির জন্য এটি গ্রহণ করবেন না ... জড়িংয়ের মানদণ্ডটি পরীক্ষা করে দেখুন।

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

(4x অবধি কয়েকটি কেস রয়েছে এবং 100 এর পরীক্ষার বাইরে index এটির একটি সূচক ওভারলে মোড রয়েছে যা আরও দ্রুত is এটি অল্প বয়স্ক তবে ইতিমধ্যে কিছু ব্যবহারকারী রয়েছে))

এটি JSON কে মানচিত্র এবং তালিকাগুলিতে দ্রুত পার্স করতে পারে অন্য কোনও lib একটি JSON ডোমকে পার্স করতে পারে এর চেয়ে দ্রুত এবং এটি সূচক ওভারলে মোড ছাড়াই। বুন ইনডেক্স ওভারলে মোডের সাথে এটি আরও দ্রুত।

এটিতে খুব দ্রুত জেএসএন ল্যাক্স মোড এবং একটি পিআইএলএসটি পার্সার মোড রয়েছে। :) (এবং একটি সুপার লো মেমোরি রয়েছে, ফ্লাইতে ইউটিএফ -8 এনকোডিং সহ বাইটস মোড থেকে সরাসরি)।

এটি জাভাবিয়ান মোডেও দ্রুততম JSON রয়েছে has

এটি নতুন, তবে গতি এবং সহজ এপিআই যদি আপনি সন্ধান করছেন তবে আমি মনে করি না এখানে আরও দ্রুত বা আরও সংক্ষিপ্ততর API রয়েছে।


আপনি কি সর্বশেষ সংস্করণে আপ টু ডেট ডকুমেন্টেশনের জন্য একটি লিঙ্ক সরবরাহ করতে পারেন? আজ অবধি, আমি 0.4 পেয়েছি, তবে সহজেই সংস্করণটির জন্য কোনও মিলের ডক লিঙ্ক বা টিউটোরিয়ালটি খুঁজে পাই না। ধন্যবাদ
বিজমার্ক

এখানে একটি টিউটোরিয়াল github.com/RichardHightower/boon/wiki/Boon-JSON-in-five-minutes বুন পাবলিক মেভেন রেপোতে রয়েছে । এটি 0.27 বা তার বেশি।
রিকহাই

richharightight.github.io/site/reLives এর 0.4 আছে, তাই আমি ভেবেছিলাম এটি সর্বশেষ। আমি কর্মক্ষেত্রে একটি প্রকল্পের জন্য বুন পরীক্ষা করে দেখছি, এটির জ্যাকসনের @ জসনআইগনোর সমান টীকা আছে কি?
বিজমার্ক

বুনন সার্ / ডিসিরিয়ালাইজেশন পারফরম্যান্সের নিম্ন প্রান্তে রয়েছে: github.com/fabienrenaud/java-json-benchmark পারফরম্যান্সের জন্য জ্যাকসন বা ডিএসএলজসন বেছে নিন। @ রিক হাই: আমি আপনার গিথুব নিয়ে কোনও সমস্যা খুলতে পারিনি, আমি আমার বেঞ্চমার্ককে উন্নত করতে বা এর কোন ভুল / যদি মিস না করে থাকে তবে তার ব্যাখ্যা সংশোধন করতে আমি আরও আগ্রহী।
ফেবিয়ান

0

ইনপুট উপর নির্ভর করে JSON ফর্ম্যাট (স্ট্রিং / ফাইল) একটি jSON স্ট্রিং তৈরি করুন। JSON এর সাথে সম্পর্কিত নমুনা বার্তা শ্রেণীর অবজেক্টটি নীচের হিসাবে পাওয়া যেতে পারে:

বার্তাটি _FromJSON = নতুন অবজেক্টম্যাপার ()। রিডভ্যালু (jSON স্ট্রিং, ম্যাসেজ.ক্লাস);


0

সবচেয়ে সহজ উপায় হ'ল আপনি এই সফট কনভার্টভ্যালু পদ্ধতিটি ব্যবহার করতে পারেন যা একটি কাস্টম পদ্ধতি যা আপনি জসনডাটা আপনার নির্দিষ্ট ডিটিও শ্রেণিতে রূপান্তর করতে পারেন।

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);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.