为什么 JSON 需要转义

为什么 JSON 需要转义? [TOC] 适合人群:入门级 JSON 和 JSON 转义 21 世纪初,Douglas Crockford 寻找一种简便的数据交换格式,能够在服务器之间交换数据。当时通用的数据交换语言是 XML,但是 Douglas Crockford 觉得 XML 的生成和解析都太麻烦,所以他提出了一种简化格式,也就是 JSON。 JSON 其结构形如 {"云原生":"Kubernetes"},可以很直观的使用字符串表示对象或数据结构。对象或数据结构使用序列化接口转换成 JSON 字符串,比如 Golang 中的json.Marshal接口。 你可能会有这样的疑问:既然 JSON 字符串结构简单,为什么不直接使用字符串拼接的方式,而是要使用 JSON 序列化接口呢? 结果显而易见:JSON 序列化接口会一并将数据中的特殊字符进行转义,防止其破坏 JSON 原有结构。比如数据中含有双引号"特殊字符,序列化接口便会对双引号进行转义,最终结果类似于{"云原生":"\"Kubernetes\""},否则,该场景下直接拼接的字符串会非法。 JSON 转义 许多程序设计语言把双引号字符(")用作字符串的分界符。反斜线(\)转义字符提供了两种方式来把双引号字符置入字符串中,或者是使用转义序列\"表示单个的"字符本身,而不是作为字符串分界符;或者是直接开始字符"的 16 进制编码值的转义序列\x22来表示",也可以使用 8 进制编码值的转义序列,如\042。 在 Python 中,下面的代码将会产生语法错误 1 print "Cloud Navite "Hello World!"."; 而另一段 Python 代码则会产生符合预期的结果 1 print "Cloud Navite \"Hello World!\"."; 在 JSON 中,也是如此:当使用 json 接口解析字符串{"云原生":""Kubernetes""}时会报错,而解析经过转义的 JSON 字符串{"云原生":"\"Kubernetes\""}则会解析成功。 ...

January 5, 2021 · 3 min · 474 words · [厉辉(Yousa)](https://github.com/Miss-you)

获取服务器本机 IP 的不同语言实现

C/C++ 版本 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 int CNetOperations::GetLocalIp(__be32 *pLocalIp, const char* pIfName) { if (!pLocalIp || !pIfName) { return (-EINVAL); } int iSocket; iSocket = socket(AF_INET, SOCK_DGRAM, 0); if (iSocket < 0) { return (-errno); } struct ifreq stIfr; memset(stIfr.ifr_name, 0x0, sizeof(stIfr.ifr_name)); strcpy(stIfr.ifr_name, pIfName); int iRet; iRet = ioctl(iSocket, SIOCGIFADDR, &stIfr); if (iRet < 0) { close(iSocket); return (-errno); } (*pLocalIp) = ((struct sockaddr_in *)&stIfr.ifr_addr)->sin_addr.s_addr; close(iSocket); return 0; } golang 版本 shell 版本 最初的想法 ...

November 25, 2020 · 1 min · 128 words · [厉辉(Yousa)](https://github.com/Miss-you)