Як конвертувати jsonString в JSONObject на Java


423

У мене змінна String називається jsonString:

{"phonetype":"N95","cat":"WP"}

Тепер я хочу перетворити його в JSON Object. Я шукав більше в Google, але не отримав очікуваних відповідей ...


1
Немає свого права, тому що я хотів створити об’єкт json із рядка json, відповідь, яку дав dogbane, показала правильний шлях до відповіді.
Пан Садід Шайх

Обидві відповіді Mappan і dogbane є правильними, але вони використовують різні модулі. Ви повинні бути обережними, щоб імпортувати правильний модуль для кожного, оскільки є багато модулів JSONObject.
Arashsoft

Я спробував з бібліотекою GSON. Перевірте це посилання .
Thirumalvalavan

Ось коротке відео, яке демонструє, як створити JSONObject в Java за допомогою org.json.
потонути

Відповіді:


677

Використання бібліотеки org.json :

try {
     JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
}catch (JSONException err){
     Log.d("Error", err.toString());
}

7
Я намагався з таким JSONObject js = new JSONObject (jsonstring); але це показує помилку. on jsonstring
Пан

29
він отримав помилку, оскільки не використовує org.json, він використовує google-gson, який не працює таким чином.
Губатрон

2
@Gubatron Спасибі чувак, ти маєш рацію, я щойно завантажив його і зробив банку так, що тепер вона працює добре.
Пан Садід Шайх

3
@dogbane Що робити, якщо я не знаю структуру рядка. Більш чітко, як я можу конвертувати динамічний згенерований jsonString в jsonObject?
Saumyaraj

70
За допомогою google-gson ви можете це зробити так:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy

163

Для тих, хто ще шукає відповідь:

JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);

23
І чи можете ви зазначити, який пакет імпортувати за той самий?
пішов на риболовлю

10
Це працює для мене з:import org.json.simple.JSONObject
Mafro34

1
Здається, що у версії 1.1.1 json-simple є певна проблема. Вищезазначене дає "Unhandled Exception" для parser.parse(та бажає пробувати або кидати. Але коли ви додаєте будь-яку, вона видає Unhandled exception type ParseExceptionпомилку, або NoClassDefFound помилку для ParseException, org.json.simple.parserнавіть коли у вас є json-простий в Maven залежностях і добре видно в бібліотеці проекту.
Juha Untinen

2
org.json - це бібліотека з підтвердженням концепції. це одна з найгірших з точки зору продуктивності та особливостей. Перш ніж вибрати, слід переглянути набір функцій та продуктивність json lib. Дивіться цей орієнтир, який я робив за допомогою JMH: github.com/fabienrenaud/java-json-benchmark Він чітко показує Джексона швидше за все і в 5 - 6 разів швидше, ніж org.json.
fabien

5
JSONParser parser = новий JSONParser (); здається знедоленим
Уайсал

46

Можна використовувати google-gson. Деталі:

Приклади об’єктів

class BagOfPrimitives {
  private int value1 = 1;
  private String value2 = "abc";
  private transient int value3 = 3;
  BagOfPrimitives() {
    // no-args constructor
  }
}

(Серіалізація)

BagOfPrimitives obj = new BagOfPrimitives();
Gson gson = new Gson();
String json = gson.toJson(obj); 
==> json is {"value1":1,"value2":"abc"}

Зауважте, що ви не можете серіалізувати об'єкти з круговими посиланнями, оскільки це призведе до нескінченної рекурсії.

(Десеріалізація)

BagOfPrimitives obj2 = gson.fromJson(json, BagOfPrimitives.class);  
==> obj2 is just like obj

Ще один приклад для Gson:

Gson легко вивчити та реалізувати, вам потрібно знати наступні два методи:

-> toJson () - перетворити об'єкт java у формат JSON

-> fromJson () - перетворити JSON в об'єкт java

import com.google.gson.Gson;

public class TestObjectToJson {
  private int data1 = 100;
  private String data2 = "hello";

  public static void main(String[] args) {
      TestObjectToJson obj = new TestObjectToJson();
      Gson gson = new Gson();

      //convert java object to JSON format
      String json = gson.toJson(obj);

      System.out.println(json);
  }

}

Вихідні дані

{"data1":100,"data2":"hello"}

Ресурси:

Домашня сторінка проекту Google Gson

Посібник користувача Gson

Приклад


"Якщо ви запитуєте оброблятись на стороні клієнта, це залежить від вашої мови програмування. Наприклад, з Java ви можете використовувати google-gson" Я думаю, ви, мабуть, мали на увазі "сервер", а не "клієнт" там. І він мітив своє запитання "Java".
TJ Crowder

+1. Зараз я використовував Gson у 4-5 проектах, у зовсім інших контекстах, на стороні сервера та клієнта (також в додатку Android), і це ніколи мене не підводило. Дуже симпатична і чиста кришка.
Джонік

Якщо ви хочете використовувати gson, але не маєте заздалегідь визначеного класу POJO (тобто у вас є загальний json без заздалегідь визначеної структури), ця відповідь може допомогти - stackoverflow.com/questions/4110664/…
Леандро Давид

40

Існують різні серіалізатори та десеріалізатори Java JSON, пов’язані із домашньої сторінки JSON .

Станом на це написання, є ці 22:

... але, звичайно, список може змінитися.


24

Рішення Java 7

import javax.json.*;

...

String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()

;


5
Ця бібліотека має найгірші показники роботи з усіх. Дивіться цей тест, який я робив з JMH: github.com/fabienrenaud/java-json-benchmark
fabien

15

Для перетворення Stringу JSONObjectвас просто потрібно передати Stringекземпляр до Constructor of JSONObject.

Наприклад:

JSONObject jsonObj = new JSONObject("your string");

10

Мені подобається використовувати google-gson для цього, і саме тому, що мені не потрібно безпосередньо працювати з JSONObject.

У такому випадку у мене буде клас, який відповідатиме властивостям вашого JSON Object

class Phone {
 public String phonetype;
 public String cat;
}


...
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
Gson gson = new Gson();
Phone fooFromJson = gson.fromJson(jsonString, Phone.class);
...

Однак я думаю, що ваше запитання більше схоже на те, як мені створити фактичний об'єкт JSONObject з рядка JSON.

Я дивився на api google-json і не зміг знайти нічого прямого, як api org.json, що, мабуть, ви хочете використовувати, якщо вам так сильно потрібні використовувати босоніжки JSONObject.

http://www.json.org/javadoc/org/json/JSONObject.html

З org.json.JSONObject (ще один зовсім інший API) Якщо ви хочете зробити щось на кшталт ...

JSONObject jsonObject = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
System.out.println(jsonObject.getString("phonetype"));

Я думаю, що краса Google-gson полягає в тому, що вам не потрібно мати справу з JSONObject. Ви просто захопите json, передаєте клас, щоб захотіти його деаріалізацію, і ваші атрибути класу будуть відповідні JSON, але знову ж таки, у кожного є свої вимоги, можливо, ви не можете дозволити собі розкіш, щоб мати попередньо складені класи на дезіаріалізуюча сторона, оскільки на стороні, що генерує JSON, може бути занадто динамічно. У такому випадку просто використовуйте json.org.


8

ви повинні імпортувати org.json

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }

8

Рядок JSON , використовуючи Jacksonзcom.fasterxml.jackson.databind :

Якщо припустити, що ваш json-рядок відображається так: jsonString = {"phonetype": "N95", "cat": "WP"}

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
 * Simple code exmpl
 */
ObjectMapper mapper = new ObjectMapper();
JsonNode node = mapper.readTree(jsonString);
String phoneType = node.get("phonetype").asText();
String cat = node.get("cat").asText();

3

Якщо ви використовуєте http://json-lib.sourceforge.net (net.sf.json.JSONObject)

це досить легко:

String myJsonString;
JSONObject json = JSONObject.fromObject(myJsonString);

або

JSONObject json = JSONSerializer.toJSON(myJsonString);

отримайте значення потім за допомогою json.getString (param), json.getInt (param) тощо.


JSONObject json = JSONSerializer.toJSON (myJsonString); створить помилку невідповідності типу, а інша працює
Анріке К.

3

Перетворити рядок у json, і жало подібно json. {"фонетик": "N95", "cat": "WP"}

String Data=response.getEntity().getText().toString(); // reading the string value 
JSONObject json = (JSONObject) new JSONParser().parse(Data);
String x=(String) json.get("phonetype");
System.out.println("Check Data"+x);
String y=(String) json.get("cat");
System.out.println("Check Data"+y);

Що таке JSONParser? Це лише частина постачальника контактів?
ІгорГанапольський

1
@IgorGanapolsky JSONParser - це опція, що надається простим JSON. Для цього включіть json-simple-1.1.1.jar
Aravind Cheekkallur

3

Використовуйте JsonNode quickxml для загального Json Parsing. Він внутрішньо створює карту ключового значення для всіх входів.

Приклад:

private void test(@RequestBody JsonNode node)

рядок введення:

{"a":"b","c":"d"}

2

Не потрібно використовувати жодну зовнішню бібліотеку.

Ви можете використовувати цей клас замість :) (обробляє навіть списки, вкладені списки та json)

public class Utility {

    public static Map<String, Object> jsonToMap(Object json) throws JSONException {

        if(json instanceof JSONObject)
            return _jsonToMap_((JSONObject)json) ;

        else if (json instanceof String)
        {
            JSONObject jsonObject = new JSONObject((String)json) ;
            return _jsonToMap_(jsonObject) ;
        }
        return null ;
    }


   private static Map<String, Object> _jsonToMap_(JSONObject json) throws JSONException {
        Map<String, Object> retMap = new HashMap<String, Object>();

        if(json != JSONObject.NULL) {
            retMap = toMap(json);
        }
        return retMap;
    }


    private static Map<String, Object> toMap(JSONObject object) throws JSONException {
        Map<String, Object> map = new HashMap<String, Object>();

        Iterator<String> keysItr = object.keys();
        while(keysItr.hasNext()) {
            String key = keysItr.next();
            Object value = object.get(key);

            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            map.put(key, value);
        }
        return map;
    }


    public static List<Object> toList(JSONArray array) throws JSONException {
        List<Object> list = new ArrayList<Object>();
        for(int i = 0; i < array.length(); i++) {
            Object value = array.get(i);
            if(value instanceof JSONArray) {
                value = toList((JSONArray) value);
            }

            else if(value instanceof JSONObject) {
                value = toMap((JSONObject) value);
            }
            list.add(value);
        }
        return list;
    }
}

Для перетворення рядка JSON в хешмак скористайтеся цим:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(

2

Codehaus Jackson - Я був цим дивовижним API з 2012 року для моїх RESTful веб-сервісів та тестів JUnit. За допомогою їх API ви можете:

(1) Перетворити рядок JSON в Java

public static String beanToJSONString(Object myJavaBean) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.writeValueAsString(myJavaBean);
}

(2) Перетворити рядок JSON в об'єкт JSON (JsonNode)

public static JsonNode stringToJSONObject(String jsonString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readTree(jsonString);
}

//Example:
String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";   
JsonNode jsonNode = stringToJSONObject(jsonString);
Assert.assertEquals("Phonetype value not legit!", "N95", jsonNode.get("phonetype").getTextValue());
Assert.assertEquals("Cat value is tragic!", "WP", jsonNode.get("cat").getTextValue());

(3) Перетворити Java Bean в JSON String

    public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
    ObjectMapper jacksonObjMapper = new ObjectMapper();
    return jacksonObjMapper.readValue(JSONString, beanClass);
}

REFS:

  1. Кодгаус Джексон

  2. API JsonNode - Як використовувати, переходити, аналізувати та оцінювати значення об'єкта JsonNode

  3. Підручник - простий підручник, як використовувати Джексона для перетворення рядка JSON в JsonNode


1

Зверніть увагу, що GSON з десеріалізацією інтерфейсу призведе до винятку, як показано нижче.

"java.lang.RuntimeException: Unable to invoke no-args constructor for interface XXX. Register an InstanceCreator with Gson for this type may fix this problem."

У той час як десеріалізувати; GSON не знає, який об'єкт повинен бути інтанізований для цього інтерфейсу.

Це вирішено якось тут .

Однак FlexJSON має своє рішення. в той час як серіалізувати час, це додавання назви класу як частини json, як показано нижче.

{
    "HTTPStatus": "OK",
    "class": "com.XXX.YYY.HTTPViewResponse",
    "code": null,
    "outputContext": {
        "class": "com.XXX.YYY.ZZZ.OutputSuccessContext",
        "eligible": true
    }
}

Тож JSON буде кумедним деяким; але вам не потрібно писати, InstanceCreatorщо потрібно в GSON.


1

Використання org.json

Якщо у вас є рядок, що містить текст формату JSON, ви можете отримати об’єкт JSON, виконавши наступні кроки:

String jsonString = "{\"phonetype\":\"N95\",\"cat\":\"WP\"}";
JSONObject jsonObj = null;
    try {
        jsonObj = new JSONObject(jsonString);
    } catch (JSONException e) {
        e.printStackTrace();
    }

Тепер для доступу до фонетики

Sysout.out.println(jsonObject.getString("phonetype"));

0

Для установки json одного об’єкта в список, тобто

"locations":{

}

в до List<Location>

використання

ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationConfig.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true);

jackson.mapper-asl-1.9.7.jar


0

Перетворення рядка в об’єкт Json за допомогою org.json.simple.JSONObject

private static JSONObject createJSONObject(String jsonString){
    JSONObject  jsonObject=new JSONObject();
    JSONParser jsonParser=new  JSONParser();
    if ((jsonString != null) && !(jsonString.isEmpty())) {
        try {
            jsonObject=(JSONObject) jsonParser.parse(jsonString);
        } catch (org.json.simple.parser.ParseException e) {
            e.printStackTrace();
        }
    }
    return jsonObject;
}

-1

Краще перейдіть більш простим способом, використовуючи org.jsonlib. Просто виконайте дуже простий підхід, як показано нижче:

JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");

Тепер objце ваша конвертована JSONObjectформа відповідної рядка. Це на випадок, якщо у вас є пари імен-значення.

Для рядка ви можете безпосередньо перейти до конструктора JSONObject. Якщо це буде дійсним json String, тоді добре, інакше викине виняток.


Буквально виконання того, що ви написали: user.put("email", "someemail@mail.com")запускає безперебійний виняток.
Себастіалонсо

1
@Sebastialonso Так, вам потрібно зловити виняток. try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
Ось так

@vidya Ні, це не так. Подумайте порівняти його ще раз.
TheLittleNaruto

@vidya Sure Dude
TheLittleNaruto
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.