জাভা এমই-তে কোনও জেএসএন স্ট্রিংকে বস্তুতে রূপান্তর করতে চান?


116

জাভা / জে 2 এমই তে কোনও স্ট্রিং রূপান্তর করার কোনও উপায় আছে যেমন:

{name:"MyNode", width:200, height:100}

কোডের একটি লাইনে একই অভ্যন্তরীণ অবজেক্টের উপস্থাপনা?

কারণ বর্তমান পদ্ধতিটি অত্যন্ত ক্লান্তিকর:

Object n = create("new");
setString(p, "name", "MyNode");
setInteger(p, "width", 200);
setInteger(p, "height", 100);

জেএসওএন লাইব্রেরি হতে পারে?


6
আপনার স্ট্রিংটি আসলে কোনও জাসন অবজেক্ট নয়, জসন স্ট্যান্ডার্ডটি দেখুন ... এটি জাভাস্ক্রিপ্ট নোটেশনের মতোই।
ফিলিহো

19
@ জেরেমি রুড: হওয়া উচিত{"name":"MyNode", "width":200, "height":100}
এস্তেবান কাবার

1
@ ভ্রমণকারী: আমি জানি, তবে জাভাস্ক্রিপ্ট স্থানীয়ভাবে উদ্ধৃতিবিহীন সম্পত্তির নাম সমর্থন করে।
TheFlash

1
@ ফিলিহো: আমি এটি জানি, তবে আমি স্পষ্টতার জন্য এটিকে এভাবে রেখেছি kept এসও সিনট্যাক্স হাইলাইটারটি এটিকে বিশৃঙ্খলা করত। নাম এবং মান লাল।
TheFlash

জাভার কোর এপিআই ব্যবহার করে রূপান্তর করার কোনও উপায় আছে কি? সম্ভবত জাভা 8? জাভা 9?
অ্যালিকেলজিন-কিলাকা

উত্তর:


108

আমি তাদের কয়েকটি ব্যবহার করেছি এবং আমার প্রিয়টি হ'ল

http://code.google.com/p/json-simple/

লাইব্রেরিটি খুব ছোট তাই এটি J2ME এর জন্য উপযুক্ত।

আপনি JSON কে জাভা অবজেক্টে এভাবে এক লাইনে পার্স করতে পারেন,

JSONObject json = (JSONObject)new JSONParser().parse("{\"name\":\"MyNode\", \"width\":200, \"height\":100}");
System.out.println("name=" + json.get("name"));
System.out.println("width=" + json.get("width"));

1
আমি কি একটি অ্যাপলেটে এই লাইব্রেরিটি ব্যবহার করতে পারি? যদি এটি প্রতিবিম্ব ব্যবহার করে তবে আমি একটি প্রতিচ্ছবি ত্রুটির মুখোমুখি হতে যাচ্ছি। এটা কি কাজ করবে?
মৃডাং আগারওয়ালা

JsonSimple এর এখনও JSONParser ক্লাস আছে? আমি ক্লাস কল করতে পারি না।
ফুউইন

JSONParser এখন অবচয় করা হয়েছে।
ভারদা এলেন্ত্রি

79

সহজ বিকল্প হ'ল জ্যাকসন :

MyObject ob = new ObjectMapper().readValue(jsonString, MyObject.class);

অন্যান্য গ্রন্থাগারগুলি ব্যবহারের জন্য একই রকম সহজ (জসন ইতিমধ্যে উল্লেখ করা হয়েছিল); তবে কিছু পছন্দগুলি আরও শ্রমসাধ্য হয়, যেমন মূল org.json লাইব্রেরি, যার জন্য আপনার যদি কোনও প্রয়োজন না থাকে তবুও আপনাকে মধ্যবর্তী "JSONObject" তৈরি করা প্রয়োজন।


জ্যাকসন J2ME সমর্থন করে না
স্কু

সত্য, যদি j2me এখনও মোটামুটি JDK 1.4 স্তরে থাকে (জ্যাকসনের 1.5 প্রয়োজন হয়)
স্টেক্সম্যান

1
আপনি কেবল ২ টি আপটিক পেয়েছেন তবে আরও বেশি প্রাপ্য। জ্যাকসন সত্যিই আমাদের অ্যাপ্লিকেশন প্লাগ ইন করতে সহজ ছিল। সুপারিশ করার জন্য ধন্যবাদ।
ড্যান ডায়ন

1
জ্যাকসন একটি সরল অবজেক্টের ডিসিরিয়ালাইজও করতে পারেন। যেমন। Object obj = new ObjectMapper().readValue("[1, 2, 3]", Object.class);
নিউনি

: আরো কোড জ্যাকসন ব্যবহার উদাহরণ mkyong.com/java/how-to-convert-java-object-to-from-json-jackson
cellepo

61

জিএসওএন হ'ল জাভা অবজেক্টকে জসন অবজেক্টে রূপান্তরিত করার জন্য একটি বিকল্প and
এটি গুগল দ্বারা সরবরাহ করা একটি সরঞ্জাম।

জাসনকে জাভা অবজেক্টের ব্যবহারে fromJson(jsonObject,javaclassname.class)
রূপান্তর করার জন্য : জাভা অবজেক্টকে জসন অবজেক্টের ব্যবহারে রূপান্তর করার জন্য: toJson(javaObject)
এবং বাকিগুলি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে

আরো বেশী তথ্য এবং ডাউনলোডের জন্য


1
+1 আমি অনুরূপ কিছু সন্ধান করছিলাম এবং এটি বিলটি পুরোপুরি ফিট করে!
রায় তাং

23

আপনি গুগল জিএসওএন দিয়ে এটি সহজেই করতে পারেন।

ধরা যাক আপনার ক্ষেত্রের ব্যবহারকারী, প্রস্থ এবং উচ্চতা সহ ব্যবহারকারী নামে একটি বর্গ রয়েছে এবং আপনি নিম্নলিখিত জেসন স্ট্রিংটিকে ব্যবহারকারীর অবজেক্টে রূপান্তর করতে চান।

{"name":"MyNode", "width":200, "height":100}

নিম্নলিখিত কোড সহ আপনি সহজেই কাস্টিং না করে (নিমক্যাপের মন্তব্যে মাথায় রেখে;)) করতে পারেন:

Gson gson = new Gson(); 
final User user = gson.fromJson(jsonString, User.class);

যেখানে jsonString উপরের JSON স্ট্রিং।

আরও তথ্যের জন্য, দয়া করে https://code.google.com/p/google-gson/ দেখুন


3
এবং হ্যাঁ, আমি বুঝতে পারি যে প্রশ্নটি 4 বছর আগে জিজ্ঞাসা করা হয়েছিল, তবে আমার উত্তরটি আগ্রহী পক্ষগুলির জন্য বর্তমানে এটি করা দরকার :) আশা করি এটি কাউকে সাহায্য করবে!
সুফিনওয়াজ

22

আপনার জাভা জন্য অনেক JSON পার্সার আছে :

  • JSONObject.java
    একটি JSONObject নাম / মান জোড়াগুলির একটি আনর্ডারড সংগ্রহ। এর বাহ্যিক রূপটি একটি স্ট্রিং যা নাম এবং মানগুলির মধ্যে কোলন সহ কোঁকড়ানো ধনুর্বন্ধনীতে আবৃত হয় এবং মান এবং নামের মধ্যে কমা হয়। অভ্যন্তরীণ ফর্ম হ'ল একটি জিনিস যা নামের সাথে মানগুলি অ্যাক্সেসের জন্য () এবং অপ্ট () পদ্ধতিগুলি পেয়ে থাকে এবং নামগুলি মূল্য যুক্ত করে বা প্রতিস্থাপনের জন্য () পদ্ধতিগুলি রাখে। মানগুলি এই ধরণের যে কোনও একটি হতে পারে: বুলিয়ান, জসোনআরে, জেএসএনওজেক্ট, সংখ্যা এবং স্ট্রিং, বা জেএসএনওবজেক্ট.নুল অবজেক্ট।

  • JSONArray.java
    একটি JSONArray হ'ল মানগুলির একটি ক্রম। এর বাহ্যিক রূপটি মানগুলির মধ্যে কমা সহ বর্গাকার বন্ধনীগুলিতে আবৃত একটি স্ট্রিং। অভ্যন্তরীণ ফর্মটি এমন একটি বস্তু যা সূচক দ্বারা মানগুলি অ্যাক্সেসের জন্য () এবং অপ্ট () পদ্ধতিগুলি পেয়ে থাকে এবং মানগুলি যুক্ত বা প্রতিস্থাপনের জন্য () পদ্ধতিগুলি রাখে। মানগুলি এই ধরণের যে কোনও একটি হতে পারে: বুলিয়ান, জসোনআরে, জেএসএনওজেক্ট, সংখ্যা এবং স্ট্রিং, বা জেএসএনওবজেক্ট.নুল অবজেক্ট।

  • JSONStringer.java
    একটি JSONStringer দ্রুত JSON পাঠ্য উত্পাদন করার জন্য একটি সরঞ্জাম।

  • JSONWriter.java
    একটি JSONWriter স্রোতে দ্রুত JSON পাঠ্য লেখার জন্য একটি সরঞ্জাম।

  • JSONTokener.java
    একটি জেএসএনটোকেনার একটি উত্সের স্ট্রিং নেয় এবং এর থেকে অক্ষর এবং টোকেনগুলি বের করে। এটি JSONObject এবং JSONArray নির্মাণকারীরা JSON উত্সের স্ট্রিংগুলি পার্স করতে ব্যবহার করে।

  • JSONException.java
    একটি সিনট্যাক্স বা পদ্ধতিগত ত্রুটি সনাক্ত হলে একটি JSONException নিক্ষেপ করা হয়।

  • JSONString.java
    JSONString এমন একটি ইন্টারফেস যা ক্লাসগুলি তাদের JSON সিরিয়ালাইজেশন প্রয়োগ করতে দেয়।


1
J2ME এর java.io.IOException থাকলে; java.io.Writer; java.lang.reflect.Field; java.lang.reflect.Modifier; java.lang.reflect.Method; java.util.Collection; java.util.HashMap; java.util.Iterator; java.util.Map; java.util.TreeSet ;, তারপর আপনি প্রথমটি ব্যবহার করতে পারেন, কারণ এগুলি সাধারণ javaক্লাস।
এস্তেবান কাবার

2
আমি মনে করি এমআইডিপি ২.০ তে কোনও java.lang.reflect প্যাকেজ নেই। জেনেরিক পার্সার তৈরি করা শক্ত করবে ...
ফিলিহো

2
স্মার্ট লোক, ভয়েজার, আপনি কেবলমাত্র জাভা জেএসএন ক্লাসের ডকুমেন্টেশনে অনুলিপি করেছেন।
TheFlash

@ জেরেমি রুড: অবশ্যই আমি করেছি, আপনি কীভাবে ভাবেন যে আমি এত তাড়াতাড়ি করেছি? এটি আপনাকে ট্রোল করার চেষ্টা নয়, এর মানক অনুশীলনটি লিংক এবং অনুলিপি উভয় ক্ষেত্রেই। আমি যদি আফসোস করি যদি এটি সেভাবে বেরিয়ে আসে।
এস্তেবান কাবার

10
আমি এটিকে হ্রাস করেছি কারণ এটি প্রশ্নের উত্তর দেয় না। এটি সম্পর্কিত ক্লাসগুলির একটি তালিকা দিচ্ছে কিন্তু প্রকৃতপক্ষে কেউই প্রশ্নকর্তা যা চায় তা সম্পাদন করে না।
জেফ মার্টিন

7

আপনার নজর রাখা উচিত যেখানে JSON অফিসিয়াল সাইট । এটি জাভাতে ব্যবহারযোগ্য বিভিন্ন লাইব্রেরি সরবরাহ করে, আমি ব্যক্তিগতভাবে এটি ব্যবহার করেছি, JSON-lib যা সাইটের কাজটি বাস্তবায়িত হয়, সুতরাং এটির ঠিক একই শ্রেণি রয়েছে - পদ্ধতিগুলি ইত্যাদি এই পৃষ্ঠায়

আপনি যদি এইচটিএমএল লিঙ্কগুলিতে ক্লিক করেন তবে আপনি যা খুশি তা খুঁজে পেতে পারেন।

সংক্ষেপে:

একটি জসন বস্তু এবং একটি জসন অ্যারে তৈরি করতে কোডটি হল:

JSONObject obj = new JSONObject();
obj.put("variable1", o1);
obj.put("variable2", o2);
JSONArray array = new JSONArray();
array.put(obj);

o1, o2, আদিম ধরণের (দীর্ঘ, অভ্যন্তরীণ, বুলিয়ান), স্ট্রিংস বা অ্যারে হতে পারে।

বিপরীত প্রক্রিয়া মোটামুটি সহজ, আমি একটি স্ট্রিংটিকে জসন অবজেক্ট / অ্যারেতে রূপান্তরিত করতে চাইছি।

String myString;

JSONObject obj = new JSONObject(myString);

JSONArray array = new JSONArray(myString);

সঠিকভাবে বিশ্লেষণ করার জন্য আপনাকে কেবল জানতে হবে যে আপনি কোনও অ্যারে বা কোনও বস্তুকে পার্স করছেন কিনা।



5

ইতিমধ্যে উল্লিখিত অনেকের মতো, নীচের মত JSON.simple ব্যবহার করে এটি করার একটি দুর্দান্ত সহজ উপায়

import org.json.JSONObject;

String someJsonString = "{name:"MyNode", width:200, height:100}";
JSONObject jsonObj = new JSONObject(someJsonString);

এবং তারপরে JSON অবজেক্টের সাথে ডিল করতে jsonObj ব্যবহার করুন। যেমন jsonObj.get ("নাম");

নীচের লিঙ্ক অনুসারে, JSON.simple ছোট এবং বড় উভয় JSON ফাইলের জন্য ধ্রুবক দক্ষতা দেখায়

http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/


আপনি লিখেছেন যে অনেকে পোস্ট করেছেন এমন পরামর্শ ইতিমধ্যে জানিয়েছে। আপনার উত্তরের সারাংশ কি?
ডাকাব

1
@ ডাকাব আপনার মন্তব্যের জন্য ধন্যবাদ। এই প্রশ্নের সারমর্মটি ছিল কোডের একটি লাইন দেওয়া যা উদ্দেশ্যটি করে। এটি করার জন্য অনেকগুলি এপিআই উপলব্ধ রয়েছে তাই আমি এপিএসের দক্ষতার তুলনা সম্পর্কে কিছু অতিরিক্ত তথ্য দিতে চেয়েছিলাম। সুতরাং এই উত্তরটির সারমর্মটি যা আমি বোঝাতে চেয়েছি তা ছিল কোডটি এই থ্রেডের অন্যান্য ফেলো দ্বারা উল্লিখিত বিভিন্ন এপিআইএসের দক্ষতার তুলনা সম্পর্কে কিছু তথ্য।
ক্রিপজ


3

এটি একটি পুরানো প্রশ্ন এবং জসন-সরল ( https://code.google.com/p/json-simple/ ) সেই সময়ে একটি ভাল সমাধান হতে পারে, তবে দয়া করে বিবেচনা করুন যে প্রকল্পটি কিছু সময়ের জন্য সক্রিয় হবে না!

আমি গসনকে পরামর্শ দিচ্ছি যা এখন হোস্ট করা হয়েছে: https://github.com/google/gson

পারফরম্যান্স যদি আপনার সমস্যা হয় তবে আপনি কিছু মানদণ্ড http://blog.takipi.com/the-ultimate-json-library-json-simple-vs-gson-vs-jackson-vs-json/ এ দেখতে পারেন যা তুলনা করে।


2

এছাড়া www.json.org আপনার কাছে ব্যবহার করে নিজস্ব পার্সার বাস্তবায়ন করতে পারে javacc এবং আপনার personnal ব্যাকরণ / স্কিমা মিলে। আমার ব্লগে এই নোটটি দেখুন: http://plindenbaum.blogspot.com/2008/07/parsing-json-with-javacc-my-notebook.html


9
কি দারুন. আমি বাজি ধরলাম যে সহজ এবং মজাদার।
TheFlash

6
খুব খারাপ আমাদের কাছে দেওয়ার জন্য "মজার" এবং "অন্তর্দৃষ্টিপূর্ণ" ব্যাজ নেই :)
স্ট্যাকসমান

2

আমি একটি লাইব্রেরি লিখেছি যা JSON পার্স করার জন্য json.org ব্যবহার করে তবে এটি আপনার জন্য একটি ইন্টারফেসের প্রক্সি তৈরি করবে। কোড / জেআর কোড.google.com.com এ রয়েছে।

http://fixjures.googlecode.com/

আমি জানি না এটি J2ME এ কাজ করে কিনা। যেহেতু এটি প্রক্সি তৈরি করতে জাভা প্রতিবিম্ব ব্যবহার করে, তাই আমি ভাবছি এটি কার্যকর হবে না। এছাড়াও এটি বর্তমানে গুগল সংগ্রহগুলিতে একটি কঠিন নির্ভরতা পেয়েছে যা আমি মুছে ফেলতে চাই এবং এটি সম্ভবত আপনার প্রয়োজনের জন্য খুব বেশি ভারী ওজনের, তবে এটি আপনাকে খুঁজছেন এমনভাবে আপনার JSON ডেটার সাথে ইন্টারঅ্যাক্ট করার অনুমতি দেয়:

interface Foo {
    String getName();
    int getWidth();
    int getHeight();
}

Foo myFoo = Fixjure.of(Foo.class).from(JSONSource.newJsonString("{ name : \"foo name\" }")).create();
String name = myFoo.getName(); // name now .equals("foo name");

আশ্চর্যজনক, যদিও আমি ফু চাই না, কেবল নেটিভ অবজেক্ট।
TheFlash

2

নিম্নলিখিত জাসন স্ট্রিং সহ জাভাতে কেবল একটি জসন বস্তু তৈরি করুন your আপনার ক্ষেত্রে

{name:"MyNode", width:200, height:100}

উপরেরটি যদি আপনার জসন স্ট্রিং হয় তবে এটির সাথে একটি জসন অবজেক্ট তৈরি করুন।

JsonString ="{name:"MyNode", width:200, height:100}";
JSONObject yourJsonObject = new JSONObject(JsonString);
System.out.println("name=" + yourJsonObject.getString("name"));
System.out.println("width=" + yourJsonObject.getString("width"));

2

জ্যাকসন বড় ফাইলগুলিতে জন্য, GSON ছোট ফাইল জন্য, এবং JSON.simple উভয় পরিচালনা করার জন্য।


1
প্রমাণ এখান থেকে @ thanga এর মন্তব্য ব্যাক আপ blog.takipi.com/...
Gob00st

আমি এটি আগেও দেখেছি, তবে ছোট ফাইলগুলি যেভাবেই পার্স করতে দ্রুত হয় তা বিবেচনা করুন। আমি কেবল জেএসএন.সিম্পল সম্পর্কেই ভাবব যদি আপনার কাছে পার্স করার জন্য ছোট ছোট একটি টোন থাকে যেখানে জ্যাকসনের চেয়ে 30% বা ততোধিক পার্থক্য যুক্ত হতে চলেছে। এছাড়াও শীর্ষস্থানীয় মন্তব্যগুলি দেখুন, সেই মানদণ্ডটি খুব নির্ভরযোগ্য নাও হতে পারে। সত্যিই, যদি গতি আপনার পক্ষে এটি গুরুত্বপূর্ণ তবে আপনার সম্ভবত ডিজাইন করা উচিত যাতে সহজেই বাস্তবায়নগুলি পরিবর্তন করতে আপনি কোনও পার্সার ইনজেকশন করতে পারেন এবং আপনার নিজের বেনমার্ক পরীক্ষা করতে পারেন।
ব্যবহারকারী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.