您的位置:首页 > 编程语言 > Java开发

Java使用百度API 返回JSON数据为unicode编码,怎么转化为中文?

2017-09-14 00:00 1271 查看
摘要: 如:{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BM020","blackDetails":"{\"C06BM020\":[{\"province\":\"\u4e92\u5357\",\"duty\":\"(2016)\u43910821\u6c11\u521d22\u53f7\",\"court\":\"\u5b21\u6d31\u54c8\u533c\u65cf\u5f3d\u65cf\u81ea\u3cbb\u53bf\u4eba\u6c11\u6cd5\u9622\"}]}"}}

在用java调用百度API的时候返回JSON时unicode编码

1,getBytes(utf-8) (没有作用,如果是单纯的unicode编码是有效的,但是如果有其他的英文数字之类就不行)

String str = "\u8eab\u4efd\u8bc1\u53f7\u7801\u4e0d\u5408\u6cd5!";
byte[] bt = str.getBytes("utf-8");
String ret = new String(bt, "utf-8");
System.out.println(ret);

2,
URLDecoder.decode()
也不行

3,

public void testparse(){
String jsonResult="{\"errNum\":-1,\"retMsg\":\"\u8eab\u4efd\u8bc1\u53f7\u7801\u4e0d\u5408\u6cd5!\",\"retData\":[]}";
JSONObject jsonObject=JSONObject.parseObject(jsonResult);
System.out.println(jsonObject.toJSONString());
}

也没有用

有效的

第一:

public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;

if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
return sb+"";
}

第二种:

// tb\u674ea\u661fb
public static String readUnicodeStr2(String unicodeStr) {
StringBuilder buf = new StringBuilder();

for (int i = 0; i < unicodeStr.length(); i++) {
char char1 = unicodeStr.charAt(i);

if (char1 == '\\' && isUnicode(unicodeStr, i)) {
String cStr = unicodeStr.substring(i + 2, i + 6);
int cInt = Integer.parseInt(cStr,16);
buf.append((char) cInt);
// 跨过当前unicode码,因为还有i++,所以这里i加5,而不是6
i = i + 5;
} else {
buf.append(char1);
}
}
return buf.toString();
}
// 判断以index从i开始的串,是不是unicode码
private static boolean isUnicode(String unicodeStr, int i) {
int len = unicodeStr.length();
int remain = len - i;
// unicode码,反斜杠后还有5个字符 uxxxx
if (remain < 5)
return false;

char flag2 = unicodeStr.charAt(i + 1);
if (flag2 != 'u')
return false;
String nextFour = unicodeStr.substring(i + 2, i + 6);
return isHexStr(nextFour);
}
/** hex str 1-9 a-f A-F */
private static boolean isHexStr(String str) {
for (int i = 0; i < str.length(); i++) {
char ch = str.charAt(i);
boolean isHex = (ch >= '1' && ch <= '9') || (ch >= 'a' && ch <= 'f') || (ch >= 'A' && ch <= 'F');
if (!isHex)
return false;
}
return true;
}

后来测试第一,第二种都有缺陷

比如第一种,她忘记最后一部分字段



{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈族彝族自治县人民法院\",\"disruptTypeName\":\"其他有履行能力而拒生效法律文书确定义务的\"}]}"}}没有红色部分

第二种 有部分字段解析不出来如

{"retCode":0,"retMsg":"OK","result":{"blackLevel":"A","blackReason":"C06BT020","blackDetails":"{\"C06BT020\":[{\"province\":\"云南\",\"duty\":\"(2016)云0821民初22号\",\"court\":\"宁洱哈尼族彝族自治县人民法院\",\"disruptTypeName\":\"其他\u6709履行\u80fd力\u800c拒\u4e0d履行生效法律文书确定义务的\""}]}"}}

所以修改第一种使之获取最后一部分(确定可以)

public static String convert(String utfString){
StringBuilder sb = new StringBuilder();
int i = -1;
int pos = 0;
int iint=0;
while((i=utfString.indexOf("\\u", pos)) != -1){
String sd = utfString.substring(pos, i);
sb.append(sd);
iint = i+5;

if(iint < utfString.length()){
pos = i+6;
sb.append((char)Integer.parseInt(utfString.substring(i+2, i+6), 16));
}
}
String endStr = utfString.substring(iint+1, utfString.length());
return sb+""+endStr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐