从服务器端获取JSON格式的数据进行解析的问题,求帮助

时间:2022-06-10 09:20:53
1、
我用硬编码的方式给出一个字符串:
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&amp;v_curdbno=0"}]}。


获取成功后经过处理成为一个字符串,然后将这个字符串传进解析Json格式的方法,但是为什么就解析不了?


5、
用硬编码的方式我是用反斜杠对双引号进行转义,要不要java是通不过编译的,于是我就把获取到的数据用String类的replaceAll("\"", "\\\"")方法,将所有的引号都变成\",可是这样也不可以。



问题就是这样,希望有人能帮忙看看,到底怎么回事

8 个解决方案

#1


只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。

#2


请贴出日志!

#3


楼主贴出错误log才能帮你解决问题。json本身是不难的,应该是小问题导致的。

#4


分段读取的内容,含多字节字符的时候,不可以分多次转换成string,应该读完后一次性转换,并且需要考虑是采用的何种编码,一般都是utf8的,如下:
Encoding.UTF8.GetString(data,0,len);

#5


我没用过json   我直接使用转成String   使用正则式来匹配解析

#6


引用 1 楼 birdsaction 的回复:
只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。


谢谢回复,原来服务器给的数据是UTF-8有BOM格式的数据,去除掉BOM格式就可以了

#7


引用 5 楼 tanwei4199 的回复:
我没用过json   我直接使用转成String   使用正则式来匹配解析


用正则表达式也是可以的,但是万一我要的内容也包含能被正则表达式解析的数据,那就悲剧了,还是用官方提供的好。。

#8


把字节流格式成string的时候等整个字节流接收完后再将整个字节流new string,不要分段拼接。

#1


只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。

#2


请贴出日志!

#3


楼主贴出错误log才能帮你解决问题。json本身是不难的,应该是小问题导致的。

#4


分段读取的内容,含多字节字符的时候,不可以分多次转换成string,应该读完后一次性转换,并且需要考虑是采用的何种编码,一般都是utf8的,如下:
Encoding.UTF8.GetString(data,0,len);

#5


我没用过json   我直接使用转成String   使用正则式来匹配解析

#6


引用 1 楼 birdsaction 的回复:
只要是工具生成的标准JSON 都是可以解析的,除非服务器端生成的JSON数据 是自己用字符串拼接的。
用jackson 库转换json格式 是比较容易,一般不会出错。
你上面贴出来的json应该是对的,你看看报什么错误。


谢谢回复,原来服务器给的数据是UTF-8有BOM格式的数据,去除掉BOM格式就可以了

#7


引用 5 楼 tanwei4199 的回复:
我没用过json   我直接使用转成String   使用正则式来匹配解析


用正则表达式也是可以的,但是万一我要的内容也包含能被正则表达式解析的数据,那就悲剧了,还是用官方提供的好。。

#8


把字节流格式成string的时候等整个字节流接收完后再将整个字节流new string,不要分段拼接。