按照标准json语法,字符串类型的value是不能换行写的.
例如,以下是错误的写法

{"key":"helloworld"
}

但是遇到了需要在json中写代码与服务器交互的情况,无奈只能这样写:

{"key":"var a = 1\nvar b = 2\n var c=a+b"
}

代码行数少了还好,多了极其**,于是想办法可以在json中换行写代码.

尝试1: json5

JSON5号称"JSON for Humans",相比标准json主要特点如下:

  • 字符串value支持换行
  • key可以不加""
  • key和value可以使用’'代替""
  • 支持注释
  • 二进制数值

栗子:
以下是一个合法的json5

{// commentsunquoted: 'and you can quote me on that',singleQuotes: 'I can use "double quotes" here',lineBreaks: "Look, Mom! \
No \\n's!",hexadecimal: 0xdecaf,leadingDecimalPoint: .8675309, andTrailing: 8675309.,positiveSign: +1,trailingComma: 'in objects', andIn: ['arrays',],"backwardsCompatible": "with JSON",
}

优点:现成

缺点:

  • 换行需要用 \ \标识;

  • 解析之后因为没有了换行,代码无法执行,所以是达不到目的的;

{"key":"var a = 1\
var b = 2\
var c=a+b"
}

解析之后的结果为

{"key":"var a = 1var b = 2var c=a+b"
}

尝试2: 编写自己的json解释器

  • 优点: 可根据自己定义的规则解析数据
  • 缺点: 成本高.

以下为用python实现的json解释器,支持换行,目前没有做完整的错误处理,请不要用于生产:

"""
遇到问题没人解答?小编创建了一个Python学习交流QQ群:778463939
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
Topic: 下降解析器
Desc :
"""
import re
import collections# Token specification
NUM = r'(?P<NUM>\d+)'
STR_D = r'"(?P<STR_D>[^"]*?)"'
STR_S = r'(?P<STR_S>\'.*?\')'
COLON = r'(?P<COLON>:)'
COMMA = r'(?P<COMMA>,)'
LLB = r'(?P<LLB>\[)'
RLB = r'(?P<RLB>\])'
LDB = r'(?P<LDB>\{)'
RDB = r'(?P<RDB>\})'
WS = r'(?P<WS>\s+)'
NULL = r'(?P<NULL>null)'
FALSE = r'(?P<FALSE>false)'
TRUE = r'(?P<TRUE>true)'master_pat = re.compile('|'.join([NUM, STR_D, STR_S, LLB, RLB,LDB, RDB, COLON, COMMA, FALSE, TRUE, NULL, WS]), re.M | re.S)
# Tokenizer
Token = collections.namedtuple('Token', ['type', 'value'])def generate_tokens(text):scanner = master_pat.scanner(text)for m in iter(scanner.match, None):tok = Token(m.lastgroup, m.group())if tok.type != 'WS':yield tokdef simple_join(text):li = []for t in generate_tokens(text):res = t[1]if t[0] == "STR_S":res = t[1].replace("'", "\"")elif t[0].startswith("STR_"):res = t[1].replace("\n", "\\n").replace("\r\n", "\\n")li.append(str(res))return "".join(li)class Evaluator:def __init__(self, text):self.text = textdef parse(self):self.tokens = generate_tokens(self.text)self.nexttok = next(self.tokens, None)self._advance()return self._parse()def _advance(self):'''Advance one token ahead'''self.tok, self.nexttok = self.nexttok, next(self.tokens, None)def _parse(self):if self.tok[0] == "LLB":return self.get_list()if self.tok[0] == "LDB":return self.get_dict()if self.tok[0].startswith("STR_"):return self.tok[1].strip('"')if self.tok[0] == "NUM":return int(self.tok[1])if self.tok[0] == "NULL":return Noneif self.tok[0] == "FALSE":return Falseif self.tok[0] == "TRUE":return Trueraise Exception("未知token:{}".format(self.tok[1]))def get_dict(self):"""{ 开头中间内容必须为 k:v,结尾必须为 }"""res = {}self._advance()# }if self.tok[0] == "RDB":return {}def parse_value():if not self.tok[0].startswith("STR_"):raise Exception(f"KEY需是字符串形式,{self.tok[1]}")new_key = self._parse()self._advance()if self.tok[0] != "COLON":raise Exception("KEY和VALUE需用:分割")self._advance()res[new_key] = self._parse()self._advance()parse_value()while self.tok[0] == "COMMA":self._advance()parse_value()return resdef get_list(self):res = []self._advance()# }if self.tok[0] == "RLB":return []def parse_value():if self.tok[0] in ["NUM", "STR_D", "STR_S", "NULL", "FALSE", "TRUE"]:res.append(self._parse())elif self.tok[0] == "LLB":res.append(self.get_list())elif self.tok[0] == "LDB":res.append(self.get_dict())parse_value()self._advance()while self.tok[0] == "COMMA":self._advance()parse_value()self._advance()return resif __name__ == '__main__':text = """{"k1":1,"k2":"v2","is_true":true,"is_none":null,"k2":"v2","k3":{"a1":"a1","a2":"a2","code":"var code = 0code = 1"},"list":[1,2,3,4]}"""# test(text)e = Evaluator(text)res = e.parse()print(res) #{'k1': 1, 'k2': 'v2', 'is_true': True, 'is_none': None, 'k3': {'a1': 'a1', 'a2': 'a2', 'code': '\n        var code = 0\n        code = 1\n        '}, 'list': [1, 2, 3, 4]}

尝试3: 全局替换 \n 为 \n

优点:简单粗暴

{"key":"
var a = 1
var b = 2
var c=a+b"
}

替换之后的结果为

{"key":"\nvar a = 1\nvar b = 2\n var c=a+b"
}

缺点:虽然写的时候有换行,但是上传到服务器再查询的时候只能看到\n,依然缺乏可读性;

尝试4(最终采用方案):

结合UI将json生成树状节点,将代码类型的value单独显示.

优点

  • 难度一般
  • 按常规方式解析json
  • 上传到服务器再查询的时候也能看到换行.

python json字符串类型的value换行方案相关推荐

  1. Python中字符串String去除出换行符(\n,\r)和空格的问题

    Python中字符串String去除出换行符和空格的问题(\n,\r) 在Python的编写过程中,获取到的字符串进场存在不明原因的换行和空格,如何整合成一个单句,成为问题. 方法: 一.去除空格 & ...

  2. python定义字符串类型_Python数据类型之字符串

    1. Python字符串的创建 字符串是Python中最常见的数据类型,通常使用单引号或双引号来定义一个字符串,如下: str = "我是字符串" str1 = '我也是字符串' ...

  3. python中字符串类型的encode()方法_第五章 Python字符串常用方法详解

    5.1 Python字符串拼接(包含字符串拼接数字) 在 Python中拼接(连接)字符串很简单,可以直接将两个字符串紧挨着写在一起,具体格式为: strname = "str1" ...

  4. JSON.parse 解析json字符串时,遇换行符报错

    Json字符串转换成Json对象时候,有两种方式: 假设d是json字符串: 1,eval('(' + d + ')'). 2,JSON.parse(d): 但是以上方式有隐患,如果Json字符串有换 ...

  5. python的字符串类型

    一.python2的字符串类型 在python2中,字符串一般有两种类型,unicode和str.(python3中是Unicode类型) str类型,字节码类型,根据某种编码把字符串转成对应的字节, ...

  6. python:判断字符串类型方法

    str对象包括如下用于判断字符串类型的方法: str.isalnum():是否全为字母或数字 str.isalpha():是否全为字母 str.isdecimal():是否只含十进制数字符号 str. ...

  7. python测试字符串类型的函数_python-02 数据类型 字符串str

    字符串str 一.字符串定义 概念:字符串是有序的 不可修改的,元素以引号包围的序列 引号类型:''单引号 ""双引号 " ""三引号 '''三单引号 ...

  8. python 测试字符串类型_【教程】如何用Python中的chardet去检测字符编码类型

    [背景] 之前已经使用过chardet了,也算用了不少次了. 之前也写过和chardet相关的: 但是没写教程,举例说明如何使用. 现在去举例解释解释. [python示例代码演示如何用chardet ...

  9. python基础===字符串的制表,换行基础操作

    \n\t 制表符和换行符 >>> print("Languages:\n\tPython\n\tC\n\tJavaScript") Languages:Pytho ...

最新文章

  1. tensorflow打印模型结构_Tensorflow上手1: Print与py_func
  2. 在Stack Overflow如果语言有问题,请写以下英文
  3. node.js初步认识
  4. Java数组的基本知识点
  5. Android之提示java.lang.RuntimeException: Parcel: unable to marshal value Image问题
  6. 高手如何实践HBase?不容错过的滴滴内部技巧
  7. webxml attribute is required (or pre-existing WEB-INF/web.xml if executing in update mode)
  8. EasyIPCamera高性能摄像机RTSP服务器RTSPServer解决方案
  9. java sqlserver 分页_java+sqlserver 使用分页存储过程
  10. java模拟内存溢出并分析_模拟内存溢出通过MAT分析
  11. 服务器cp所以型号,云服务器cp
  12. 国际信息安全管理标准体系--BS7799
  13. Win10下Photoshop cc 2019安装
  14. 鹅厂打响互联网大厂校招第一枪!
  15. 浅浅分析滤波器截止频率
  16. wifidog 源码初分析
  17. unsw计算机专业排名,2019上海软科世界一流学科排名计算机科学与工程专业排名新南威尔士大学排名第76-100...
  18. java 大数加减算法
  19. Microsoft OLE DB Provider for ODBC Drivers 错误 ‘80004005‘ 兼容
  20. 一道简简单单的字节跳动算法面试题

热门文章

  1. Linux文本处理三剑客之awk
  2. yield return的理解
  3. [转载]WPF – 使用触发器
  4. 选择51cto.com
  5. sap abap 对字符串的操作
  6. 使用SoapUI 测试Web Service
  7. sap中二级品报工问题解决方案
  8. 在vs2005中使用Com连接SAP系统(二)
  9. 数据分析精华经验分享,看看冠军是如何炼成的?
  10. 冰墩墩+周杰伦也救不了NFT