Java中使用json傳輸數據時,有時會遇到亂碼的問題。這個問題通常是由于數據編碼格式和接收方編碼格式不一致導致的。
在傳輸數據時,通常需要借助于第三方庫,例如Gson或者FastJson。這些庫在序列化Java對象為json字符串時,通常會使用UTF-8編碼格式。而接收方在解析json字符串時,如果沒有指定編碼格式,則默認使用ISO-8859-1編碼格式。
//使用Gson序列化Java對象為json字符串 Gson gson = new Gson(); String json = gson.toJson(obj); //使用FastJson序列化Java對象為json字符串 String json = JSON.toJSONString(obj);
解決亂碼問題的方法有兩種:
1. 接收方指定編碼格式
//使用Gson解析json字符串 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); String json = ... MyClass obj = gson.fromJson(new InputStreamReader(new ByteArrayInputStream(json.getBytes("UTF-8")), "UTF-8"), MyClass.class); //使用FastJson解析json字符串 String json = ... MyClass obj = JSON.parseObject(json, MyClass.class, Feature.IgnoreNotMatch, Feature.AllowComment, Feature.AutoCloseSource, Feature.UseBigDecimal);
2. 在序列化和解析時都使用同一個編碼格式
//使用Gson序列化Java對象為json字符串 Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); String json = ... byte[] data = json.getBytes("UTF-8"); //使用Gson解析json字符串 MyClass obj = gson.fromJson(new InputStreamReader(new ByteArrayInputStream(data), "UTF-8"), MyClass.class); //使用FastJson序列化Java對象為json字符串 String json = ... byte[] data = json.getBytes("UTF-8"); //使用FastJson解析json字符串 MyClass obj = JSON.parseObject(new String(data, "UTF-8"), MyClass.class, Feature.IgnoreNotMatch, Feature.AllowComment, Feature.AutoCloseSource, Feature.UseBigDecimal);
總之,無論使用哪種方法解決亂碼問題,都需要保證序列化和解析時使用的編碼格式一致,否則會導致傳輸數據出現問題。