Как конвертировать jsonString в JSONObject в Java

423

У меня есть строковая переменная с именем jsonString:

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

Теперь я хочу преобразовать его в объект JSON. Я искал больше в Google, но не получил ожидаемых ответов ...

Г-н Саджид Шейх
источник
1
Нет, это правильно, потому что я хотел создать объект json из строки json, ответ, данный dogbane, показал правильный путь к ответу.
г-н Саджид Шейх
Оба ответа Mappan и Dogbane верны, но они используют разные модули. Вы должны быть осторожны, чтобы импортировать правильный модуль для каждого, потому что есть много модулей JSONObject.
Arashsoft 14.12.15
Я попробовал с библиотекой GSON. Пожалуйста, проверьте эту ссылку .
Thirumalvalavan
Вот короткое видео, которое демонстрирует, как создать JSONObject в Java с помощью org.json.
drorw

Ответы:

678

Использование библиотеки 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); но это показывает ошибку. на jsonstring
г-н Саджид Шейх
29
он получил ошибку, потому что он не использует org.json, он использует google-gson, который так не работает.
Губатрон
2
@Gubatron Спасибо, чувак, ты прав, я только что загрузил его и сделал jar, так что теперь он работает нормально.
г-н Саджид Шейх
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);
Mappan
источник
23
И можете ли вы указать, какой пакет импортировать для того же?
Исчез
10
Это работает для меня с:import org.json.simple.JSONObject
Mafro34
1
Версия 1.1.1 json-simple, похоже, имеет некоторые проблемы. Вышесказанное дает «Необработанное исключение» для parser.parse(и требует try-catch или throws. Но когда вы добавляете один из них, он выдает Unhandled exception type ParseExceptionошибку или ошибку NoClassDefFound для ParseException, org.json.simple.parserдаже если у вас есть json-simple в Maven и ясно видны в библиотеке проекта.
Юха Унтинен
2
org.json - это библиотека для проверки концепции. это один из худших с точки зрения производительности и возможностей. Прежде чем выбирать, следует взглянуть на набор функций и производительность библиотеки json. Посмотрите на этот тест, который я сделал, используя JMH: github.com/fabienrenaud/java-json-benchmark. Он ясно показывает, что Джексон быстрее, чем что-либо еще, и в 5-6 раз быстрее, чем org.json.
Фабиен
5
JSONParser parser = new 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

пример

kamaci
источник
«Если вы запрашиваете обработку на стороне клиента, это зависит от вашего языка программирования. Например, с Java вы можете использовать google-gson». Я думаю, что вы, вероятно, имели в виду «сервер», а не «клиент». И он пометил свой вопрос "Ява".
TJ Crowder
+1. Я использовал Gson в 4-5 проектах сейчас, в совершенно разных контекстах, на стороне сервера и клиента (также в приложении для Android), и это никогда не подводило меня. Очень хорошая и чистая библиотека.
Йоник
Если вы хотите использовать gson, но у вас нет предварительно определенного класса POJO (то есть у вас есть общий json без предварительно определенной структуры), этот ответ может помочь - stackoverflow.com/questions/4110664/…
Leandro David
40

С домашней страницей JSON связаны различные сериализаторы и десериализаторы Java JSON .

На момент написания этой статьи есть 22:

... но, конечно, список может измениться.

TJ Crowder
источник
24

Решение Java 7

import javax.json.*;

...

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

;

RSG
источник
5
Эта библиотека имеет худшую производительность из всех. Посмотрите этот тест, который я сделал с JMH: github.com/fabienrenaud/java-json-benchmark
fabien
15

Чтобы преобразовать Stringв JSONObjectвас просто нужно передать Stringэкземпляр в конструктор JSONObject.

Например:

JSONObject jsonObj = new JSONObject("your string");
Чара
источник
10

Мне нравится использовать google-gson для этого, и это именно потому, что мне не нужно работать с JSONObject напрямую.

В этом случае у меня будет класс, который будет соответствовать свойствам вашего объекта JSON

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.

Gubatron
источник
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();
Yugerten
источник
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. { "PHONETYPE": "N95", "кот": "РГ"}

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
Аравинд Чиккаллур
3

Использовать JsonNode of fastxml для общего анализа Json. Он внутренне создает карту значения ключа для всех входных данных.

Пример:

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, используйте это:

HashMap<String, Object> hashMap = new HashMap<>(Utility.jsonToMap(
Натеш бхат
источник
2

Codehaus Jackson - с 2012 года я являюсь этим замечательным API для моих тестов RESTful webservice и 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-бин в строку JSON.

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

REFS:

  1. Codehaus Jackson

  2. JsonNode API - Как использовать, перемещаться, анализировать и оценивать значения из объекта JsonNode

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

Panini Luncher
источник
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

user3012570
источник
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, тогда ладно, иначе он выдаст исключение.

TheLittleNaruto
источник
Буквально делая то, что вы написали: 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.}
TheLittleNaruto
@vidya Нет, это не так. Попробуйте сравнить это снова.
TheLittleNaruto
@vidya Конечно Dude
TheLittleNaruto