Istnieją dane JSON, które zawierają pewne wartości liczbowe. Jak przekonwertować wszystkie cyfry na ciągi? (zawiń cytaty)
Przykład:
{
"id":1,
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":1000,
"pndNumber":20000,
"zoneNumber":4
}
powinno stać się
{
"id":"1",
"customer":"user",
"plate":"BMT-216-A",
"country":"GB",
"amount":"1000",
"pndNumber":"20000",
"zoneNumber":"4"
}
{"a":{"b":1},"b":null}
na{ "a": "{\"b\":1}", "b": "null" }
null
(wciąż warte odnotowania IMO, mimo że próbka PO nie ma żadnej z nich).oto proste rozwiązanie oparte na
jtc
narzędziu unix:jeśli chcesz zastosować zmiany bezpośrednio w pliku json, użyj
-f
przełącznika w następujący sposób:Proponowane rozwiązanie będzie działać poprawnie z dowolną strukturą jsons, np .:
-w'<>n:'
-w'<any>b:'
Również zadanie odwrotne (bez cytowania wszystkich liczb) można łatwo osiągnąć w podobny sposób: powiedzmy, że
file.json
jest już „przywołane”, aby cofnąć cytację wszystkich liczb:AKTUALIZACJA : najnowsza wersja
jtc
implementuje teraz szablony i przestrzenie nazw. Dzięki temu nie jest wymagane wywoływanie powłoki zewnętrznej:jtc
instrukcja obsługi: https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.mdźródło
Cytuję wszystko, co nie jest cytowane i nie jest
[]{}:,whitespace
, więc cytuje liczbytrue
,false
inull
.W szczególności zacytowałbym to, co pasuje do specyfikacji numeru json, a to nie jest już w cudzysłowie.
Wykonują one dokładne tokenizowanie w oparciu o specyfikację JSON, nie jest to przybliżenie.
źródło
Próbowałem z poniższą metodą i działało dobrze.
Dwa razy próbowałem potokować do mojego poziomu, aby go zmniejszyć
Komenda:
Wynik:
źródło
\{1,\},
? Aby sprawdzić, czy element pojawia się co najmniej raz, użyj+
. I to nie zadziała dla liczb takich jak -123, 0xab, 0o12, 0b1011, 1e23 lub 1.2e3 ...\{1,\}
jest BRE odpowiednikiem ERE+
. Niektóresed
implementacje obsługują\+
jako przedłużenie lub-E
lub-r
opcję włączenia Eres, ale to nie jest przenośne.\?
jest innym nieprzenośnym rozszerzeniem, którego standardowym odpowiednikiem jest\{0,1\}