我用硬编码的方式给出一个字符串:
String string = "{\"book\": [{\"title\": \"Java 2 API大全.上\",\"author\": \"王涛等编著\", \"press\": \"北京:电子工业出版社,2003.01\",\"page\": \"87,1063页\", \"price\": \"CNY210.00(全2册)\",\"number\": \"TP312/143/1\", \"detail\": \"DispBibDetail?v_recno=128553&v_curdbno=0\"}]}";
2、
进行解析的代码:
/**
* 解析JSON格式的字符串
*
* @param jsonString
* 要解析的字符串
* @return 返回 List<Map<String, Object>> 集合,String==标题,Object==内容
* @throws Exception
*/
public List<Map<String, String>> parseJson(String jsonString)
throws Exception
{
JSONObject allData = new JSONObject(jsonString); // 定义JSONObject,包装进data字符串
JSONArray jsonArr = allData.getJSONArray("book"); // 取出JSONArray
System.out.println("~~~~~~~~~~~~~~~~~~~~~~");
List<Map<String, String>> all = new ArrayList<Map<String, String>>();
for (int x = 0; x < jsonArr.length(); x++)
{ // 取出数组中的每一个JSONObject
Map<String, String> map = new HashMap<String, String>(); // 保存每一组信息
JSONObject jsonObj = jsonArr.getJSONObject(x); // 取得每一个JSONObject
map.put("title", jsonObj.getString("title")); // 取出并保存title内容
map.put("author", jsonObj.getString("author")); // 取出并保存author内容
map.put("press", jsonObj.getString("press")); // 取出并保存press内容
map.put("page", jsonObj.getString("page")); // 取出并保存page内容
map.put("price", jsonObj.getString("price")); // 取出并保存price内容
map.put("number", jsonObj.getString("number")); // 取出并保存number内容
map.put("detail", jsonObj.getString("detail")); // 取出并保存detail内容
all.add(map); // 向集合中保存
}
return all; // 返回全部记录
}
这样的方式是没有问题的。
可是我通过获取服务器端Json格式的数据,来进行解析,为什么就不可以呢?
3、
我获取服务器数据的方式是这样的:
private String loadData()
{
StringBuilder stringBuilder = new StringBuilder();
try
{
URL url = new URL("http", "10.82.10.199", 80, "/libsearch1_8.php?"
+ params); // 连接地址
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
byte[] data = new byte[1024]; // 开辟空间
while (true)
{
int len = conn.getInputStream().read(data); // 接收数据
String temp = new String(data, 0, len).trim();
stringBuilder.append(temp);
if (len <= 0)
{
break;
}
}
conn.getInputStream().close(); // 关闭输入流
} catch (Exception e)
{
e.printStackTrace();
}
return stringBuilder.toString();
}
4、
获取到的数据是这样的:
{"book":[{"title":"Java 2 API大全.上","author":"王涛等编著","press":"北京:电子工业出版社,2003.01","page":"87,1063页","price":"CNY210.00(全2册)","number":"TP312/143/1","detail":"DispBibDetail?v_recno=128553&v_curdbno=0"}]}。
获取成功后经过处理成为一个字符串,然后将这个字符串传进解析Json格式的方法,但是为什么就解析不了?
5、
用硬编码的方式我是用反斜杠对双引号进行转义,要不要java是通不过编译的,于是我就把获取到的数据用String类的replaceAll("\"", "\\\"")方法,将所有的引号都变成\",可是这样也不可以。
问题就是这样,希望有人能帮忙看看,到底怎么回事
8 个解决方案
#1
只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。
#2
请贴出日志!
#3
楼主贴出错误log才能帮你解决问题。json本身是不难的,应该是小问题导致的。
#4
分段读取的内容,含多字节字符的时候,不可以分多次转换成string,应该读完后一次性转换,并且需要考虑是采用的何种编码,一般都是utf8的,如下:
Encoding.UTF8.GetString(data,0,len);
Encoding.UTF8.GetString(data,0,len);
#5
我没用过json 我直接使用转成String 使用正则式来匹配解析
#6
谢谢回复,原来服务器给的数据是UTF-8有BOM格式的数据,去除掉BOM格式就可以了
#7
用正则表达式也是可以的,但是万一我要的内容也包含能被正则表达式解析的数据,那就悲剧了,还是用官方提供的好。。
#8
把字节流格式成string的时候等整个字节流接收完后再将整个字节流new string,不要分段拼接。
#1
只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。
#2
请贴出日志!
#3
楼主贴出错误log才能帮你解决问题。json本身是不难的,应该是小问题导致的。
#4
分段读取的内容,含多字节字符的时候,不可以分多次转换成string,应该读完后一次性转换,并且需要考虑是采用的何种编码,一般都是utf8的,如下:
Encoding.UTF8.GetString(data,0,len);
Encoding.UTF8.GetString(data,0,len);
#5
我没用过json 我直接使用转成String 使用正则式来匹配解析
#6
谢谢回复,原来服务器给的数据是UTF-8有BOM格式的数据,去除掉BOM格式就可以了
#7
用正则表达式也是可以的,但是万一我要的内容也包含能被正则表达式解析的数据,那就悲剧了,还是用官方提供的好。。
#8
把字节流格式成string的时候等整个字节流接收完后再将整个字节流new string,不要分段拼接。