之前已经提出过这个问题,但我无法从对这些问题的回答中找出代码中的错误。
我正在尝试将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。
答案 0 :(得分:16)
您正在向JSONObject
构造函数传递StringBuilder
类的实例。
这是使用JSONObject(Object)
构造函数,而不是JSONObject(String)
构造函数。
您的代码应为:
JSONObject jsonObj = new JSONObject(jsonString.toString());
答案 1 :(得分:3)
@Nishit,JSONObject本身并不了解如何解析StringBuilder;相反,您似乎使用JSONObject(java.lang.Object bean)构造函数来创建JSONObject,但是将其传递给StringBuilder。
有关该特定构造函数的详细信息,请参阅此链接。
http://www.json.org/javadoc/org/json/JSONObject.html#JSONObject%28java.lang.Object%29
当构造函数调用java.lang.Object类时,很可能它真的告诉你,你应该创建自己的类(因为所有类最终扩展java.lang.Object)并且它将接口以特定的方式使用该类,虽然通常它将调用接口(因此名称)或者它可以“抽象地”接受任何类和接口,例如在其上调用.toString()。最重要的是,您通常不能只将 任何 类传递给它,并期望它能够正常工作。
无论如何,这个特定的构造函数都是这样解释的:
使用bean getter从Object构造一个JSONObject。它反映了对象的所有公共方法。对于没有参数且名称以“get”或“is”开头,后跟大写字母的每个方法,将调用该方法,并将一个键和从getter方法返回的值放入新的JSONObject中。通过删除“get”或“is”前缀来形成密钥。如果第二个剩余字符不是大写字母,则第一个字符将转换为小写字母。例如,如果一个对象有一个名为“getName”的方法,并且调用object.getName()的结果是“Larry Fine”,那么JSONObject将包含“name”:“Larry Fine”。
所以,这意味着它期望你创建自己的实现get或is方法的类(即
public String getName() {...}
或
public boolean isValid() {...}
所以,为了解决你的问题,如果你真的想要更高级别的控制并想要做一些操作(例如修改一些值等)但仍然使用StringBuilder动态生成代码,你可以创建一个类扩展StringBuilder类,以便您可以使用append功能,但实现get / is方法以允许JSONObject从中提取数据,但这可能不是您想要/需要的,并且根据JSON,您可能会花费一个很多时间和精力创建私有字段和get / is方法(或者使用IDE为你做这些),如果你不一定知道JSON字符串的细分,那么它可能一无所获。
因此,您可以非常简单地在StringBuilder上调用toString()
,它将提供StringBuilder实例的String表示形式并将其传递给JSONObject构造函数,如下所示:
...
StringBuilder jsonString = new StringBuilder();
while((readAPIResponse = br.readLine()) != null){
jsonString.append(readAPIResponse);
}
JSONObject jsonObj = new JSONObject(jsonString.toString());
...
答案 2 :(得分:1)
使用ObjectMapper对象将String转换为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);
答案 3 :(得分:0)
传递给构造函数JSONObject
的字符串必须使用quote()
进行转义:
public static java.lang.String quote(java.lang.String string)
您的代码现在是:
JSONObject jsonObj = new JSONObject.quote(jsonString.toString());
System.out.println(jsonString);
System.out.println("---------------------------");
System.out.println(jsonObj);
答案 4 :(得分:-1)
你的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);
注意:强>
以下信息对您有所帮助 - json.org。
<强>更新强>
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);