如何将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);