Как конвертировать jsonString в JSONObject в Java
У меня есть строковая переменная называется jsonString
:
{"phonetype":"N95","cat":"WP"}
Теперь я хочу преобразовать его в объект JSON. Я искал больше в Google, но не получил ожидаемых ответов...
21 ответ
Использование библиотеки org.json:
JSONObject jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
Для тех, кто все еще ищет ответ:
JSONParser parser = new JSONParser();
JSONObject json = (JSONObject) parser.parse(stringToParse);
Ты можешь использовать 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"}
Ресурсы:
С домашней страницей JSON связаны различные сериализаторы и десериализаторы Java JSON.
На момент написания этой статьи существует 20:
- org.json
- org.json.me
- JSON JSON Processor
- Json Пб
- Инструменты JSON
- JSON-простой
- Stringtree
- Sojo
- Restlet
- отделываться
- JSON-TagLib
- XStream
- JsonMarshaller
- Flexjson
- JON инструменты
- Google-gson
- Арго
- стержень
- jsonij
- fastjson
... но, конечно, список может измениться.
Решение Java 7
import javax.json.*;
...
String TEXT;
JsonObject body = Json.createReader(new StringReader(TEXT)).readObject()
;
Преобразовать String
в JSONObject
вам просто нужно передать String
экземпляр в конструкторе JSONObject
,
Например:
JSONObject jsonObj = new JSONObject("your string");
Строка в 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();
Мне нравится использовать 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 Generation все может быть слишком динамично. В этом случае просто используйте json.org.
Те, кто не нашел решения из опубликованных ответов из-за проблем с устаревшим, вы можете использовать
JsonParser
с com.google.gson.
Пример:
JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
System.out.println(jsonObject.get("phonetype"));
System.out.println(jsonObject.get("cat"));
Вы должны импортировать org.json
JSONObject jsonObj = null;
try {
jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
} catch (JSONException e) {
e.printStackTrace();
}
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
public static Object JSONStringToBean(Class myBeanClass, String JSONString) throws Exception {
ObjectMapper jacksonObjMapper = new ObjectMapper();
return jacksonObjMapper.readValue(JSONString, beanClass);
}
ССЫЛКИ:
JsonNode API - как использовать, перемещаться, анализировать и оценивать значения из объекта JsonNode
Учебник - Простой учебник, как использовать Джексон для преобразования строки JSON в JsonNode
Преобразование String в объект 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;
}
Чтобы преобразовать строку в 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);
Использовать JsonNode of rapidxml для общего анализа Json. Он внутренне создает карту значения ключа для всех входных данных.
Пример:
private void test(@RequestBody JsonNode node)
строка ввода:
{"a":"b","c":"d"}
Если вы используете 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) и так далее.
Нет необходимости использовать какую-либо внешнюю библиотеку.
Вместо этого вы можете использовать этот класс:) (обрабатывает даже списки, вложенные списки и 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(
Использование 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"));
Для установки одного объекта 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
Обратите внимание, что 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.
Лучше иди с более простым способом, используя org.json
Lib. Просто сделайте очень простой подход, как показано ниже:
JSONObject obj = new JSONObject();
obj.put("phonetype", "N95");
obj.put("cat", "WP");
Сейчас obj
ваш обращенный JSONObject
Форма вашей соответствующей строки. Это в случае, если у вас есть пары имя-значение.
Для строки вы можете напрямую перейти к конструктору JSONObject
, Если это будет действительным json String
, тогда ладно, иначе будет исключение.
Для того, кто используетcom.alibaba/fastjson
, скажем, более сложный формат данных, который выглядит следующим образом:
{
"phonetype":"N95",
"cat":"WP",
"data":{
"phone":"95",
"kitty":"W"
}
}
Вы можете проанализировать данные, как показано ниже:
JSONObject jsonObject = JSON.parseObject(str);
String pt = jsonObject.getString("phonetype");
JSONObject d = jsonObject.getJSONObject("data");
String p = d.getString("phone");
Если вы хотите получить ключ и значение, пример кода показан ниже:
for(Map.Entry<String,Object> entry : jsonObject.entrySet()){
String key = entry.getKey();
Object value = entry.getValue();
System.out.println(key + ", " + value.toString());
}
Зависимость pom для проекта maven:
<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>