如何在Java中将jsonString转换为JSONObject

How to convert jsonString to JSONObject in Java

提问人:Mr. Sajid Shaikh 提问时间:3/9/2011 最后编辑:Andrzej SydorMr. Sajid Shaikh 更新时间:4/21/2023 访问量:2080065

问:

我有一个名为的字符串变量:jsonString

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

现在我想将其转换为JSON对象。我在谷歌上搜索了更多,但没有得到任何预期的答案!

Java 数组 JSON 解析

评论

1赞 Mr. Sajid Shaikh 8/20/2015
不,因为它想从 json 字符串创建 json 对象,dogbane 给出的答案显示了正确的答案。
0赞 Arashsoft 12/15/2015
Mappan 和 dogbane 的答案都是正确的,但它们使用的模块不同。您应该小心为每个模块导入正确的模块,因为有许多 JSONObject 模块。
0赞 Thirumalvalavan 6/6/2017
我尝试使用GSON库。请查看此链接
0赞 drorw 11/14/2018
下面是一个简短的视频,演示了如何使用 org.json 在 Java 中创建 JSONObject。

答:

45赞 T.J. Crowder 3/9/2011 #1

JSON 主页链接了各种 Java JSON 序列化程序和反序列化程序。

在撰写本文时,有以下 22 个:

...但当然,列表可以更改。

846赞 dogbane 3/9/2011 #2

使用 org.json 库:

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

评论

11赞 Mr. Sajid Shaikh 3/9/2011
我尝试过这样的 JSONObject js=new JSONObject(jsonstring);但它显示错误。在 jsonstring 上
39赞 Gubatron 3/9/2011
他遇到了一个错误,因为他没有使用 org.json,他使用的是 google-gson,但这种方式不起作用。
2赞 Mr. Sajid Shaikh 3/10/2011
@Gubatron 谢谢伙计,你是对的,我刚刚下载了它并制作了 jar,所以现在它工作正常。
3赞 Saumyaraj 3/20/2014
@dogbane 如果我不知道字符串的结构怎么办。更明确地说,如何将动态生成的 jsonString 转换为 jsonObject?
84赞 kazy 5/14/2015
使用 google-gson,您可以这样做:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
56赞 kamaci 3/9/2011 #3

您可以使用 .详: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 用户指南

评论

0赞 T.J. Crowder 3/9/2011
“如果你要求在客户端进行处理,这取决于你的编程语言。例如,在 Java 中,您可以使用 google-gson“,我想您可能指的是”服务器“而不是”客户端”。他确实给他的问题贴上了“Java”的标签。
0赞 Jonik 11/1/2013
+1.我现在已经在 4-5 个项目中使用了 Gson,在完全不同的上下文中,服务器端和客户端(也在 Android 应用程序中),它从未让我失望过。非常好&干净的lib。
0赞 Leandro David 2/2/2018
如果你想使用 gson 但没有预定义的 POJO 类(即你有一个没有预定义结构的通用 json),这个答案可能会有所帮助 - stackoverflow.com/questions/4110664/...
12赞 Gubatron 3/9/2011 #4

我喜欢为此使用 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);
...

但是,我认为您的问题更像是,如何从 JSON 字符串中获得实际的 JSONObject 对象。

我正在查看 google-json api,但找不到任何像 org.json 的 api,如果您非常需要使用准系统 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。

3赞 Thero 4/3/2013 #5

如果您使用的是 http://json-lib.sourceforge.net (net.sf.json.JSONObject)

这很简单:

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

JSONObject json = JSONSerializer.toJSON(myJsonString);

然后使用 OR/and 获取值,依此类推。json.getString(param)json.getInt(param)

评论

0赞 Henrique C. 10/18/2013
JSONObject json = JSONSerializer.toJSON(myJsonString);将产生一个错误,类型不匹配,另一个工作
3赞 Aravind Cheekkallur 10/10/2013 #6

将字符串转换为 json,并且 sting 类似于 json。{“phonetype”:“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);

评论

0赞 IgorGanapolsky 11/2/2013
什么是 JSONParser?它只是联系人提供商的一部分吗?
1赞 Aravind Cheekkallur 11/5/2013
@IgorGanapolsky JSONParser 是由简单 JSON 提供的内置选项。为此,请包含 json-simple-1.1.1.jar
1赞 user3012570 11/20/2013 #7

用于将 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

9赞 Cabezas 9/11/2014 #8

必须导入 org.json

JSONObject jsonObj = null;
        try {
            jsonObj = new JSONObject("{\"phonetype\":\"N95\",\"cat\":\"WP\"}");
        } catch (JSONException e) {
            e.printStackTrace();
        }
203赞 Mappan 9/30/2014 #9

对于仍在寻找答案的人:

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

评论

33赞 gonephishing 6/18/2015
您能提到要导入哪个包裹吗?
17赞 Mafro34 7/29/2015
这对我有用:import org.json.simple.JSONObject
2赞 Juha Untinen 2/17/2016
json-simple 的 1.1.1 版似乎有一些问题。上面给出了“未处理的异常”,并希望尝试捕获或抛出。但是,当您添加任何一个时,即使您在 Maven depedencies 中有 json-simple 并且在项目库中清晰可见,它也会为 ParseException 提供错误或 NoClassDefFound 错误。parser.parse(Unhandled exception type ParseExceptionorg.json.simple.parser
4赞 fabien 6/28/2016
org.json 是一个概念验证库。就性能和功能而言,它是最差的之一。在选择之前,应该查看 json 库的功能集和性能。请参阅我使用 JMH 所做的这个基准测试: github.com/fabienrenaud/java-json-benchmark 它清楚地显示 jackson 比其他任何东西都快,比 org.json 快 5 到 6 倍。
13赞 Ouissal 7/9/2018
JSONParser 解析器 = new JSONParser();似乎被剥夺了
-1赞 TheLittleNaruto 11/11/2014 #10

最好使用 lib 以更简单的方式进行。只需执行非常简单的方法,如下所示:org.json

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

现在是各自字符串的转换形式。如果您有名称/值对,则会出现这种情况。objJSONObject

对于字符串,您可以直接传递给 的构造函数。如果它是有效的,那么没问题,否则它会抛出异常。JSONObjectjson String

评论

0赞 Sebastialonso 12/29/2015
从字面上看,按照你写的去做:触发一个未经处理的异常。user.put("email", "[email protected]")
1赞 TheLittleNaruto 12/29/2015
@Sebastialonso 是的,您需要捕获异常。喜欢这个:try {JSONObject jObj = new JSONObject();} catch (JSONException e) {Log.e("MYAPP", "unexpected JSON exception", e);// Do something to recover.}
0赞 TheLittleNaruto 10/19/2017
@vidya 不,不是。考虑再次比较。
0赞 TheLittleNaruto 10/19/2017
@vidya Sure Dude
27赞 RSG 3/24/2015 #11

Java 7 解决方案

import javax.json.*;

...

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

;

评论

5赞 fabien 6/28/2016
该库的性能是所有库中最差的。请参阅我使用 JMH 所做的这个基准测试:github.com/fabienrenaud/java-json-benchmark
24赞 Charu 11/6/2015 #12

要转换为 您只需要将实例传递给 的构造函数。StringJSONObjectStringJSONObject

例如:

JSONObject jsonObj = new JSONObject("your string");
3赞 Vishnu 9/8/2016 #13

使用 fasterxml 的 JsonNode 进行泛型 Json 解析。它在内部为所有输入创建一个键值映射。

例:

private void test(@RequestBody JsonNode node)

input 字符串 :

{"a":"b","c":"d"}
1赞 Kanagavelu Sugumar 11/18/2016 #14

请注意,反序列化接口的 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 会有些累赘;但你不需要GSON中需要的写入。InstanceCreator

2赞 Natesh bhat 7/1/2018 #15

无需使用任何外部库。

你可以用这个类代替:)(处理偶数列表、嵌套列表和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(
21赞 Yugerten 12/8/2018 #16

字符串转换为 JSON,与:Jacksoncom.fasterxml.jackson.databind

假设您的 json-string 表示为: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();
1赞 Azhar Zafar 3/8/2019 #17

使用 org.json

如果你有一个包含JSON格式文本的字符串,那么你可以通过以下步骤获取JSON对象:

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

现在访问 phonetype

Sysout.out.println(jsonObject.getString("phonetype"));
6赞 Panini Luncher 11/13/2019 #18

Codehaus Jackson - 自 2012 年以来,我一直在 RESTful Web 服务和 JUnit 测试中使用这个很棒的 API。使用他们的 API,您可以:

(1) 将 JSON 字符串转换为 Java Bean

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

裁判:

  1. Codehaus Jackson(杰克逊代码旅馆)

  2. JsonNode API - 如何使用、导航、解析和评估 JsonNode 对象中的值

  3. Tutorial - 如何使用Jackson将JSON字符串转换为JsonNode的简单教程

6赞 Anzar Ansari 12/4/2019 #19

使用 org.json.simple.JSONObject 将字符串转换为 Json 对象

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;
}
10赞 Chintan Patel 3/12/2022 #20

那些由于弃用问题而无法从发布的答案中找到解决方案的人,您可以从 com.google.gson 使用。JsonParser

例:

JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject();
System.out.println(jsonObject.get("phonetype"));
System.out.println(jsonObject.get("cat"));

评论

0赞 Dipan Mandal 5/25/2022
为我工作。我曾经解析从 AWS API 网关收到的身体刺痛。JsonObject 请求;字符串 body = request.get(“body”).toString();logger.log(“正文:” + 正文);字符串 jsonObject = JsonParser.parseString(body).getAsString();
-1赞 Nick Dong 3/24/2023 #21

对于使用 的人,假设更复杂的数据格式,如下所示: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());
}

maven 项目的 pom 依赖:

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>fastjson</artifactId>
  <version>1.2.47</version>
</dependency>