寫在前面的話:
有一個小功能是在讀取數據庫配置后將數據以json字符串的形式傳給了前端,前端使用JSON.parse()方法轉換字符串的時候提示失敗了,總結了一下解決的辦法:
1.對字符串進行轉義。
2.保存數據的時候進行編碼。
3.后端直接返回個對象跳過使用JSON.parse()方法。
1.對字符串進行轉義
一些常用的轉義字符:
1、空格 :
2、&:&
3、<:<
4、>:>l;
5、":"
6、':'
6、版權 :©
轉義可以使用js的replace()方法
2.保存數據的時候進行編碼
使用js自帶的encodeURI()對可能出現錯誤的文件進行編碼之后再保存起來,需要讀取的時候用decodeURI()方法再對該字符串進行解碼。
該方法的優缺點:
優點:不需要像第一種方法一樣針對一個個的字符進行轉義,不會出現遺漏特殊字符的情況。
缺點:對不需要編碼的字符也一並進行了編碼之后增加了數據的存儲空間,給服務器帶來了一點存儲壓力。
3.后端直接返回個對象跳過使用JSON.parse()方法
如果數據是從后端傳過來的,可以用對象的方式代替傳遞JSON字符串也就略過了使用JSON.parse()方法。
在這里舉一個后端使用C#的小栗子:
首先創建一個實體類:
public class FastProcessData
{
public string alarmflag { get; set; }
public string alarmname { get; set; }
public string highflag { get; set; }
public string lowflag { get; set; }
public int alarmtype { get; set; }
public string sendmsg { get; set; }
public bool isstart { get; set; }
}
接着讀取數據的時候使用該實體的list<> 泛型列接收數據庫的信息
for (int i = 0; i < table.Rows.Count; i++)
{
DataRow row = table.Rows[i];
str = string.IsNullOrEmpty(row["AlarmFlag"].ToString()) ? "0" : row["AlarmFlag"].ToString();
long[] typys = BinaryHelper.BigintToArray(Convert.ToInt64(str));
binHighFlag = typys[0].ToString();
binLowFlag = typys[1].ToString();
FastProcessData model = new FastProcessData()
{
alarmflag = row["AlarmFlag"].ToString(),
alarmname = row["AlarmName"].ToString(),
highflag = binHighFlag,
lowflag = binLowFlag,
alarmtype = Convert.ToInt32(row["AlarmType"]),
sendmsg = row["SendMsg"].ToString(),
isstart = Convert.ToBoolean(row["IsStart"])
};
list.Add(model);
};
接着在控制器中返回賦值的實體對象 ,前端接受到的就是對象了