我在需要读取JSON对象的场景中遇到了困难,在Java中,键中没有双引号,也没有值,如下面的示例所示:
"{id: 267107086801, productCode: 02-671070868, lastUpdate: 2018-07-15, lastUpdateTimestamp: 2018-07-15 01:49:58, user: {pf: {document: 123456789, name: Luis Fernando}, address: {street: Rua Pref. Josu00e9 Alves Lima,number:37}, payment: [{sequential: 1, id: CREDIT_CARD, value: 188, installments: 9}]}"
我可以使用下面的代码在字段中添加双引号,使用replaceAll
和Gson库:
String jsonString = gson.toJson (obj);
String jsonString = jsonString.replaceAll ("([\\ w] +) [] *:", "\" $ 1 \ ":"); // to quote before: value
jsonString = jsonString.replaceAll (": [] * ([\\ w @ \\.] +)", ": \" $ 1 \ ""); // to quote after: value, add special character as needed to the exclusion list in regex
jsonString = jsonString.replaceAll (": [] * \" ([\\ d] +) \ "", ": $ 1"); // to un-quote decimal value
jsonString = jsonString.replaceAll ("\" true \ "", "true"); // to un-quote boolean
jsonString = jsonString.replaceAll ("\" false \ "", "false"); // to un-quote boolean
但是,带有日期的字段会被错误地分解,例如:
"{"id" : 267107086801,"productCode" : 02-671070868,"lastUpdate" : 2018-07-15,"lastUpdateTimestamp" : 2018-07-15 "01" : 49 : 58,"user" :{"pf":{"document" : 123456789, "name" : "Luis" Fernando},"address" :{"street" : "Rua"Pref.Josu00e9AlvesLima,"number" : 37},"payment" : [{"sequential" : 1,"id" : "CREDIT_CARD","value" : 188,"installments" : 9}]}"
还有,带空格的字符串也是错误的。我怎么能纠正这个逻辑呢?我做错了什么?提前感谢。
2条答案
按热度按时间gtlvzcf81#
输出量:
{id:“267107086801”,产品代码:“02-671070868”,最后更新日期:“2018年7月15日”,上次更新时间戳:“2018-07-15 01:49:58”,用户:{pf:{文档:“123456789”,姓名:“路易斯·费尔南多”},地址:{街道:“Rua Pref. Josu 00 e9 Alves Lima”,编号:“37”},付款方式:[{连续:“1”,标识:“信用卡”,值:“188”,分期付款:“9”}]}
非平凡正则表达式的一个缺点是它们很难阅读。我在这里使用的正则表达式匹配每个文字值(但不是对象或数组)。我使用冒号、逗号和大括号来指导匹配,所以我不需要关心每个字符串值里面是什么,它可以是任何字符(除了逗号或右大括号)。这些部分的意思是:
(?<=: ?)
:值前有冒号和可选空格(lookbehind)(?![ \\{\\[])
该值 * 不 * 以空白、大括号或方括号开头(负前瞻;空白,因为我们不希望冒号和值之间的空白被视为值的一部分)(.+?)
:该值由至少一个字符组成,尽可能少(勉强量词;或regex将尝试获取字符串的其余部分)(?=,|})
:值后面是逗号或右大括号(正向查找)。如果您不熟悉JSON,我认为您不需要引用它的名字。但是,您可以:
{【商品编号】:“267107086801”,【商品编码】:“02-671070868”,“上次更新时间”:“2018年7月15日”,“上次更新时间戳”:“2018-07-15 01:49:58”,用户:{pf:{“文件”:“123456789”,“姓名”:“路易斯·费尔南多”},地址:{“街道”:“Rua Pref. Josu 00 e9 Alves Lima”,“编号”:“37”},付款方式:[{“连续”:“1”,“标识”:“信用卡”,“值”:“188”、“分期付款”:“9”}]}
i7uaboj42#
下面代码处理JSON字符串中的单引号以及包含数字的键
如果您有任何问题,请联系我们。//返回键后的空格。",",":,”); jsonString = jsonString.替换所有(“(?〈=:(?)(?![ {[])(.+?)(?=,|})""、"$1””);如果您有任何问题,请在这里输入您的密码。|(1)在一个给定的时间内,对一个给定的值进行计算,得到一个新的值;如果您有任何问题,请联系我们。//将布尔值反引号括起来。replaceAll(“false”);//取消对布尔值的引用。replaceAll(“null”);//将空字符串取消引号。replaceAll(“:“,",“:“,””);//删除不必要的双引号jsonString = jsonString.replaceAll(“真”",“真”);//将布尔值取消引号。replaceAll(“',","',”);//处理json字符串中的单引号。//将双引号放在以单引号结尾的字符串之后