gson 当值为日期时,如何使用Java在JSON字符串中添加引号

iezvtpos  于 2022-11-23  发布在  Java
关注(0)|答案(2)|浏览(162)

我在需要读取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}]}"

我可以使用下面的代码在字段中添加双引号,使用replaceAllGson库:

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}]}"

还有,带空格的字符串也是错误的。我怎么能纠正这个逻辑呢?我做错了什么?提前感谢。

gtlvzcf8

gtlvzcf81#

String incorrectJson = "{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}]}";

    String correctJson = incorrectJson.replaceAll("(?<=: ?)(?![ \\{\\[])(.+?)(?=,|})", "\"$1\"");
    System.out.println(correctJson);

输出量:
{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,我认为您不需要引用它的名字。但是,您可以:

String correctJson = incorrectJson.replaceAll(
            "(?<=\\{|, ?)([a-zA-Z]+?): ?(?![ \\{\\[])(.+?)(?=,|})", "\"$1\": \"$2\"");

{【商品编号】:“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”}]}

i7uaboj4

i7uaboj42#

下面代码处理JSON字符串中的单引号以及包含数字的键
如果您有任何问题,请联系我们。//返回键后的空格。",",":,”); jsonString = jsonString.替换所有(“(?〈=:(?)(?![ {[])(.+?)(?=,|})""、"$1””);如果您有任何问题,请在这里输入您的密码。|(1)在一个给定的时间内,对一个给定的值进行计算,得到一个新的值;如果您有任何问题,请联系我们。//将布尔值反引号括起来。replaceAll(“false”);//取消对布尔值的引用。replaceAll(“null”);//将空字符串取消引号。replaceAll(“:“,",“:“,””);//删除不必要的双引号jsonString = jsonString.replaceAll(“真”",“真”);//将布尔值取消引号。replaceAll(“',","',”);//处理json字符串中的单引号。//将双引号放在以单引号结尾的字符串之后

相关问题