問題

私は、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}]}"
 

また、スペースを持つ文字列も間違っています。どうすればこのロジックを修正できますか?私は間違って何をしていますか?前もって感謝します。

  ベストアンサー

     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"、productCode: "02-671070868"、lastUpdate: "2018-07-15"、lastUpdateTimestamp: "2018-07-15 01:49:58"、ユーザー:{pf: {document: "123456789"、名前: "Luis Fernando"}、住所:{street: "Rua" Pref.Josu0e9 Alves Lima, "number:"37"}, payment:[{securation: "1", ID: "credit_macurd"、値: "188"、分割払い: "9"}}}

非自明な正規表現の欠点の1つは、読みにくいことです。私がここで使用しているものは、各リテラル値(オブジェクトや配列である値ではありません)と一致します。私はコロン、カンマ、中括弧を使ってマッチングを導いているので、各文字列値の中に何があるのか気にする必要はありません。

  • (?<=: ?):値の前にオプションで空白のコロンがあります(lookbehind)
  • (?![ \{\[])値は空白、中括弧または角括弧で始まりません(負の先読み、空白はコロンと値の一部として取得する値の間に空白が必要ないためです)
  • (.+?):値は、可能な限り少なくとも1文字で構成されています(消極的な量指定子、または正規表現は文字列の残りの部分を取ろうとします)
  • (?=,|}):値がカンマまたは右中括弧(正の先読み)のいずれかになった後。

JSONに精通していないので、名前を引用する必要はないと思います。しかし、あなたはかもしれません:

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

{"id": "267107086801"、 "productCode": "02-671070868"、 "lastUpdate": "2018-07-15"、 "lastUpdateTimestamp": "2018-0715 01:49:58"、ユーザー:{pf: {"ドキュメント": "123456789"、 "名前": "ルイス・フェルナンド"}、住所: {"street": "Rua Pref.Josu00e9 Alves Lima"、 "number": "37"}、支払い: [{"シーケンシャル": "1"、 "id": "credit_cardum"、 "value": "188"、 "分割": "9"}}}

  同じタグがついた質問を見る

javajsonstringdategson