Android中解决Json字符串或Json数组的转义问题
最近做串口开发时通过不同的串口协议控制设备改变状态后需要把各种设备信息上报给后台,调用接口时发现上报给后台的参数转义了,于是通过日志和调试找了半天发现是Json的问题.
1.上传给后台的部分参数如下:
{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{\"applianceId\":\"\",\"fanSpeed\":\"2\",\"friendlyName\":\"\",\"mode\":\"Low\",\"status\":\"on\",\"temperature\":\"16\"}"}
2.模拟上报设备状态接口方法如下:
private void initData() {
JSONObject deviceObject = new JSONObject();
try {
deviceObject.put("address", "02");
deviceObject.put("deviceType", "03");
deviceObject.put("friendlyName", "空调");
AttributesBean acAttributesBean = new AttributesBean();
acAttributesBean.setStatus("on");
acAttributesBean.setTemperature("22");
acAttributesBean.setFanSpeed("3");
acAttributesBean.setMode("low");
String attributes = new Gson().toJson(acAttributesBean);
LogUtils.d(TAG,"--构建的设备信息为--" + attributes);
deviceObject.put("attributes",(attributes));
LogUtils.d(TAG,"--转义前的设备信息为--" + deviceObject);
List<String> list = new ArrayList<>();
list.add(JsonUtils.Companion.getReplace(deviceObject.toString()));
LogUtils.d(TAG,"--转义后的设备上报数组为--"+ list);
deviceObject.put("devices", list);
LogUtils.d(TAG,"--设备上报信息为--" + list);
JSONArray jsonArray = new JSONArray();
jsonArray.put(deviceObject);
LogUtils.d(TAG,"--转义前的设备上报信息json数组为--" + jsonArray);
LogUtils.d(TAG,"--转义后的设备上报信息json数组为--" + (jsonArray.toString()));
} catch (JSONException e) {
e.printStackTrace();
}
}
3.日志如下:
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:45)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --构建的设备信息为--{"applianceId":"","fanSpeed":"2","friendlyName":"","mode":"Low","status":"on","temperature":"16"}
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:47)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --转义前的设备信息为--{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{\"applianceId\":\"\",\"fanSpeed\":\"2\",\"friendlyName\":\"\",\"mode\":\"Low\",\"status\":\"on\",\"temperature\":\"16\"}"}
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:50)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --转义后的设备上报数组为--[{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{"applianceId":"","fanSpeed":"2","friendlyName":"","mode":"Low","status":"on","temperature":"16"}"}]
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:52)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --设备上报信息为--[{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{"applianceId":"","fanSpeed":"2","friendlyName":"","mode":"Low","status":"on","temperature":"16"}"}]
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:55)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --转义前的设备上报信息json数组为--[{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{\"applianceId\":\"\",\"fanSpeed\":\"2\",\"friendlyName\":\"\",\"mode\":\"Low\",\"status\":\"on\",\"temperature\":\"16\"}"}]
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────
│ main, com.example.escapechardemo.MainActivity.initData(MainActivity.java:56)
├┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄
│ args[0] = MainActivityLog
│ args[1] = --转义后的设备上报信息json数组为--[{"address":"02","deviceType":"03","friendlyName":"空调","attributes":"{"applianceId":"","fanSpeed":"2","friendlyName":"","mode":"Low","status":"on","temperature":"16"}"}]
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────
4.实体类:
/**
*@author: njb
*@date: 2023/4/15 22:36
*@desc:
*/
data class AttributesBean(
var friendlyName: String? = "",
var fanSpeed: String? = "",
var status: String = "",
var applianceId: String = "",
var mode: String = "",
var temperature: String? = ""
): Serializable
5.工具类:
/**
*@author: njb
*@date: 2023/4/15 23:01
*@desc:解决Json字符串转义的工具类
*/
class JsonUtils {
companion object {
open fun getReplace(str: String): String {
return str.replace("\\\\".toRegex(), "")
}
}
}
6.完整的测试代码如下:
package com.example.escapechardemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.blankj.utilcode.util.LogUtils;
import com.example.escapechardemo.bean.AttributesBean;
import com.example.escapechardemo.utils.JsonUtils;
import com.google.gson.Gson;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivityLog";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
}
private void initData() {
JSONObject deviceObject = new JSONObject();
try {
deviceObject.put("address", "02");
deviceObject.put("deviceType", "03");
deviceObject.put("friendlyName", "空调");
AttributesBean acAttributesBean = new AttributesBean();
acAttributesBean.setStatus("on");
acAttributesBean.setTemperature("22");
acAttributesBean.setFanSpeed("3");
acAttributesBean.setMode("low");
String attributes = new Gson().toJson(acAttributesBean);
LogUtils.d(TAG,"--构建的设备信息为--" + attributes);
deviceObject.put("attributes",(attributes));
LogUtils.d(TAG,"--转义前的设备信息为--" + deviceObject);
List<String> list = new ArrayList<>();
list.add(JsonUtils.Companion.getReplace(deviceObject.toString()));
LogUtils.d(TAG,"--转义后的设备上报数组为--"+ list);
deviceObject.put("devices", list);
LogUtils.d(TAG,"--设备上报信息为--" + list);
JSONArray jsonArray = new JSONArray();
jsonArray.put(deviceObject);
LogUtils.d(TAG,"--转义前的设备上报信息json数组为--" + jsonArray);
LogUtils.d(TAG,"--转义后的设备上报信息json数组为--" + (jsonArray.toString()));
} catch (JSONException e) {
e.printStackTrace();
}
}
}
7.项目源码如下:
https://gitee.com/jackning_admin/es-cape-char-demo
8.总结:
虽然说转义对接口可能影响不是很大,但是终究是个问题,还是要找到问题,想办法解决,不能把问题扔给别人,这样不少一个好习惯,但是终归是解决了,准备休息关机睡觉。。。