如何在Java中将jsonString转换为JSONObject


423

我有String变量称为jsonString

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

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


1
没有正确的选择,因为我想从json字符串创建json对象,dogbane给出的答案显示了正确的答案。
Sajid Shaikh先生,2015年

Mappan和Dogbane的答案都是正确的,但是它们使用的模块不同。您应该小心为每个模块导入正确的模块,因为有许多JSONObject模块。
Arashsoft

我尝试了GSON库。请检查此链接
Thirumalvalavan

这是一个简短的视频,演示了如何使用org.json在Java中创建JSONObject。
drorw

Answers:


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); 但显示错误。在jsonstring上
Sajid Shaikh先生

29
他因为未使用org.json而不是google-gson而出错,因此无法正常工作。
Gubatron 2011年

2
@Gubatron谢谢老兄,您是对的,我刚刚下载了它并制作了jar,所以现在可以正常使用了。
萨吉德·谢赫先生

3
@dogbane如果我不知道字符串的结构该怎么办。更清楚地讲,如何将动态生成的jsonString转换为jsonObject?
Saumyaraj 2014年

70
使用google-gson,您可以这样操作:JsonObject obj = new JsonParser().parse(jsonString).getAsJsonObject();
kazy 2015年

163

对于仍在寻找答案的任何人:

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

23
能否请您指出要导入哪个软件包?
网上仿佛

10
这对我import org.json.simple.JSONObject
有用

1
json-simple的1.1.1版本似乎存在一些问题。上面给出了“未处理的异常”,parser.parse(并希望尝试捕获或抛出。但是,当您添加其中之一时,即使您在Maven依赖项中具有json-simple并且在项目库中清晰可见,它也会Unhandled exception type ParseException为ParseException 给出错误或NoClassDefFound错误org.json.simple.parser
Juha Untinen

2
org.json是一个概念证明库。就性能和功能而言,它是最差的之一。在选择之前,应该先查看json库的功能集和性能。请参阅我使用JMH所做的基准测试:github.com/fabienrenaud/java-json-benchmark它清楚地显示了jackson比其他任何东西都快,比org.json快5至6倍。
fabien

5
JSONParser解析器=新的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 Project主页

Gson用户指南


“如果您要在客户端进行处理,则取决于您的编程语言。例如,在Java中,您可以使用google-gson”。我认为您可能在这里意思是“服务器”而不是“客户端”。他确实将问题标记为“ Java”。
TJ Crowder

+1。现在,我已经在4-5个项目中使用了Gson,在不同的上下文中,服务器和客户端(也在Android应用程序中)都使用过Gson,这从未使我失败。非常好和干净的库。
约尼克,

如果你想使用GSON但没有POJO类中定义的预(也就是你有没有一个预先定义结构的通用JSON),这个答案可能会帮助- stackoverflow.com/questions/4110664/...
莱昂德罗大卫



15

要转换StringJSONObject,只需要将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);
...

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

我正在看google-json api,找不到像org.json的api一样直接的东西,如果您非常需要使用准系统JSONObject,那么这可能就是您想要使用的api。

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

使用Jacksonwith将字符串转换为JSONcom.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();

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); 将生产型的erroe不匹配的另一个作品
恩里克C.

3

将字符串转换为json和字符串类似于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);

什么是JSONParser?它只是联系人提供商的一部分吗?
IgorGanapolsky

1
@IgorGanapolsky JSONParser是简单JSON提供的选项。为此,请包括json-simple-1.1.1.jar
Aravind Cheekkallur,2013年

3

使用fastxml的JsonNode进行通用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网络服务和JUnit测试。借助他们的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);
}

REFS:

  1. Codehaus Jackson

  2. JsonNode API-如何使用,浏览,解析和评估JsonNode对象中的值

  3. 教程 -简单的教程,如何使用Jackson将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将变得有些麻烦;但您不需要InstanceCreatorGSON中需要的写入。


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

使用org.json.simple.JSONObject将String转换为Json Object

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")触发未处理的异常。
Sebastialonso 2015年

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 Sure Dude
TheLittleNaruto
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.