Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将Java字符串转换为JSON对象_Java_Json_Org.json - Fatal编程技术网

如何将Java字符串转换为JSON对象

如何将Java字符串转换为JSON对象,java,json,org.json,Java,Json,Org.json,这个问题在前面已经被问过了,但是我无法从对这些问题的回答中找出代码中的错误 我正在尝试将java字符串转换为json对象。 代码如下: import org.json.JSONObject; //Other lines of code URL seatURL = new URL("http://freemusicarchive.org/api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2"); //Return the JSON Re

这个问题在前面已经被问过了,但是我无法从对这些问题的回答中找出代码中的错误


我正在尝试将java字符串转换为json对象。 代码如下:

import org.json.JSONObject;
//Other lines of code
URL seatURL = new URL("http://freemusicarchive.org/api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2");
//Return the JSON Response from the API
BufferedReader br = new BufferedReader(new InputStreamReader(seatURL.openStream(),Charset.forName("UTF-8")));
String readAPIResponse = " ";
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString);
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);
输出为:

{"title":"Free Music Archive - Genres","message":"","errors":[],"total":"163","total_pages":82,"page":1,"limit":"2","dataset":[{"genre_id":"1","genre_parent_id":"38","genre_title":"Avant-Garde","genre_handle":"Avant-Garde","genre_color":"#006666"},{"genre_id":"2","genre_parent_id":null,"genre_title":"International","genre_handle":"International","genre_color":"#CC3300"}]}
---------------------------
{}
因此,正如您所看到的,jsonstring正在获取数据,但jsonObj没有。
我使用的是org.json JAR。

传递给构造函数的字符串
JSONObject
必须使用
quote()
进行转义:

您的代码现在是:

JSONObject jsonObj = new JSONObject.quote(jsonString.toString());
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);
你的json-

{
    "title":"Free Music Archive - Genres",
    "message":"",
    "errors":[
    ],
    "total":"163",
    "total_pages":82,
    "page":1,
    "limit":"2",
    "dataset":[
    {
    "genre_id":"1",
    "genre_parent_id":"38",
    "genre_title":"Avant-Garde",
    "genre_handle":"Avant-Garde",
    "genre_color":"#006666"
    },
    {
    "genre_id":"2",
    "genre_parent_id":null,
    "genre_title":"International",
    "genre_handle":"International",
    "genre_color":"#CC3300"
    }
    ]
    }
JSON.org
-

JSONObject o = new JSONObject(jsonString);
注意:

import org.json.JSONObject;
 //Other lines of code
URL seatURL = new URL("http://freemusicarchive.org/
 api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2");
 //Return the JSON Response from the API
 BufferedReader br = new BufferedReader(new         
 InputStreamReader(seatURL.openStream(),
 Charset.forName("UTF-8")));
 String readAPIResponse = " ";
 StringBuilder jsonString = new StringBuilder();
 while((readAPIResponse = br.readLine()) != null){
   jsonString.append(readAPIResponse);
 }
 JSONObject jsonObj = new JSONObject(jsonString.toString());
 System.out.println(jsonString);
 System.out.println("---------------------------");
 System.out.println(jsonObj);
以下信息将对您有所帮助-

更新:

import org.json.JSONObject;
 //Other lines of code
URL seatURL = new URL("http://freemusicarchive.org/
 api/get/genres.json?api_key=60BLHNQCAOUFPIBZ&limit=2");
 //Return the JSON Response from the API
 BufferedReader br = new BufferedReader(new         
 InputStreamReader(seatURL.openStream(),
 Charset.forName("UTF-8")));
 String readAPIResponse = " ";
 StringBuilder jsonString = new StringBuilder();
 while((readAPIResponse = br.readLine()) != null){
   jsonString.append(readAPIResponse);
 }
 JSONObject jsonObj = new JSONObject(jsonString.toString());
 System.out.println(jsonString);
 System.out.println("---------------------------");
 System.out.println(jsonObj);

您正在向
JSONObject
构造函数传递
StringBuilder
类的实例

这是使用
JSONObject(Object)
构造函数,而不是
JSONObject(String)
构造函数

您的代码应该是:

JSONObject jsonObj = new JSONObject(jsonString.toString());

@Nishit,JSONObject本身并不理解如何通过StringBuilder进行解析;相反,您似乎是在使用JSONObject(java.lang.Object bean)构造函数来创建JSONObject,但会向它传递一个StringBuilder

有关该特定构造函数的更多信息,请参阅此链接

当构造器调用java.lang.Object类时,很可能它实际上是在告诉您,您需要创建自己的类(因为所有类最终都扩展了java.lang.Object),并且它将以特定的方式与该类进行接口,尽管它通常会调用接口(因此得名)或者,它可以“抽象地”接受任何类及其接口,比如对其调用.toString()。底线是,你通常不能仅仅通过任何一门课程,然后期望它工作

无论如何,这个特殊的构造器被解释为:

使用bean getter从对象构造JSONObject。它反映了对象的所有公共方法。对于没有参数且名称以“get”或“is”开头,后跟大写字母的每个方法,将调用该方法,并将从getter方法返回的键和值放入新的JSONObject中。密钥是通过删除“get”或“is”前缀形成的。如果剩余的第二个字符不是大写,则第一个字符将转换为小写。例如,如果一个对象有一个名为“getName”的方法,并且调用object.getName()的结果是“Larry Fine”,那么JSONObject将包含“name”:“Larry Fine”

因此,这意味着它希望您创建自己的类来实现get或is方法(即

所以,为了解决您的问题,如果您真的想要更高级别的控制,并且想要进行一些操作(例如修改一些值等)但是仍然使用StringBuilder来动态生成代码,您可以创建一个扩展StringBuilder类的类,以便使用append功能,但是实现get/is方法以允许JSONObject从中提取数据,但是这可能不是您想要/需要的,并且根据JSON的不同,您可能会花费大量时间和精力创建私有字段和get/is方法(或者使用IDE为您创建)或者如果您不一定知道JSON字符串的分解,那么这一切都可能是徒劳的

因此,您可以非常简单地在StringBuilder上调用
toString()
,它将提供StringBuilder实例的字符串表示,并将其传递给JSONObject构造函数,如下所示:

...
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString.toString());
...

使用ObjectMapper对象将字符串转换为JsonNode:

ObjectMapper mapper = new ObjectMapper();

// For text string
JsonNode = mapper.readValue(mapper.writeValueAsString("Text-string"), JsonNode.class)

// For Array String
JsonNode = mapper.readValue("[\"Text-Array\"]"), JsonNode.class)

// For Json String 
String json = "{\"id\" : \"1\"}";
ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getFactory();
JsonParser jsonParser = factory.createParser(json);
JsonNode node = mapper.readTree(jsonParser);

你有代表原始JSON字符串的类吗?如果有,它的名称是什么?请看这个@Bohemian:字符串是从URL动态创建的。我不确定,除了纯字符串类之外,是否还有其他代表它的类。@Gunaselan:当我创建JSON对象时,如你提到的链接所示,它可以工作。但是,我的数据因为对象是动态出现的,当我尝试动态创建JSONObject时,它失败了。也许,我真的很愚蠢,但我仍然看不出我所做的和你所建议的有什么区别。请你详细说明以便我能理解。谢谢你应该删除这个答案。quote()生成一个格式正确的字符串以插入JSON文本。请在此处阅读文档:@Joiner:这是发送
jsonString
的另一种方法。然后将
quote()
更改为
JSONObject.quote(String)
,并链接JavaDoc。@Joiner:哦,是这样。@user0815:第二种方法。请参阅我的更新答案。:)@我的上帝,你从这个答案中抄袭了。@Joiner:哈哈……真的吗?请参见计时…)@乔纳:哎呀!我什么也没看到。我是瞎子。像这样详细的回答,总是帮助像我们这样天真的人理解幕后到底发生了什么。谢谢您的时间,先生。
...
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
    jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString.toString());
...
ObjectMapper mapper = new ObjectMapper();

// For text string
JsonNode = mapper.readValue(mapper.writeValueAsString("Text-string"), JsonNode.class)

// For Array String
JsonNode = mapper.readValue("[\"Text-Array\"]"), JsonNode.class)

// For Json String 
String json = "{\"id\" : \"1\"}";
ObjectMapper mapper = new ObjectMapper();
JsonFactory factory = mapper.getFactory();
JsonParser jsonParser = factory.createParser(json);
JsonNode node = mapper.readTree(jsonParser);