Как добавить кавычки в строку JSON, используя Java, когда значение является датой - PullRequest
0 голосов
/ 08 февраля 2019

Я сталкиваюсь с трудностями в сценарии, в котором мне нужно прочитать объект 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}]}"

Iсмог добавить двойные кавычки в поля, используя код ниже, с 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}]}"

Кроме того, строки с пробелами также неверны.Как я мог исправить эту логику?Что я делаю неправильно?Заранее спасибо.

1 Ответ

0 голосов
/ 09 февраля 2019
    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-1501:49:58 ", пользователь: {pf: {document:" 123456789 ", имя:" Luis Fernando "}, адрес: {улица:" Rua Pref. Josu00e9 Alves Lima ", номер:" 37 "}, оплата:[{sequential: "1", id: "CREDIT_CARD", значение: "188", взносы: "9"}]}

Один недостаток нетривиальных регулярных выражений - они могут быть сложнымичитать.Тот, который я здесь использую, соответствует каждому литеральному значению (но не значениям, которые являются объектами или массивами).Я использую двоеточия, запятые и фигурные скобки для определения соответствия, поэтому мне не нужно заботиться о том, что находится внутри каждого строкового значения, это могут быть любые символы (кроме запятой или правой фигурной скобки).Части означают:

  • (?<=: ?): есть двоеточие или необязательный пробел перед значением (lookbehind)
  • (?![ \\{\\[]) значение не startс пробелом, фигурной скобкой или квадратной скобкой (отрицательный взгляд; пробел, потому что мы не хотим, чтобы пробел между двоеточием и значением принимался как часть значения)
  • (.+?): значение состоит изпо крайней мере одного символа, как можно меньше (неохотный квантификатор; или регулярное выражение будет пытаться взять остальную часть строки)
  • (?=,|}): после значения идет запятая или правая фигурная скобка (положительнос нетерпением).

Не будучи хорошо разбирающимся в JSON, я не думаю, что вам нужно цитировать имя.Однако вы можете:

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

{"id": "267107086801", "productCode": "02-671070868", "lastUpdate": "2018-07-15", "lastUpdateTimestamp":" 2018-07-15 01:49:58 ", пользователь: {pf: {" document ":" 123456789 "," name ":" Luis Fernando "}, адрес: {" street ":" Rua Pref.Josu00e9 Алвес Лима "," номер ":" 37 "}, оплата: [{" последовательный ":" 1 "," id ":" CREDIT_CARD "," значение ":" 188 "," взносы ":" 9 "}]}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...