~/tools / LLM JSON Repair
LLM JSON Repair — Napraw zepsuty JSON zwrócony przez model AI
Napraw niemal-JSON zwracany przez modele AI: usuwa znaczniki bloku kodu i towarzyszący tekst, końcowe przecinki i komentarze, poprawia cudzysłowy, klucze i wartości z Pythona, a na końcu wypisuje dokładnie, co zmienił. Nic nie opuszcza twojej przeglądarki.
Stosowane są tylko poprawki z jednym jasnym rozwiązaniem. Wszystko inne jest zgłaszane z podaniem pozycji, zamiast być zgadywane.
Wszystko działa w twojej przeglądarce. Wklejony tekst nie jest wysyłany.
Modele językowe często opakowują JSON w blok kodu i zdanie komentarza, a potem psują składnię: końcowy przecinek, apostrofy, komentarz, True zamiast true. JSON.parse odrzuca to wszystko. To narzędzie znajduje JSON w tekście i naprawia tylko te błędy, które mają jedno oczywiste rozwiązanie, a następnie wypisuje każdą zmianę, żebyś mógł ją ocenić. Jeśli odpowiedź została ucięta, domyka to, co jest otwarte, i ostrzega, że mogło zabraknąć danych. Narzędzie nie zgaduje: dane, których nie umie naprawić, zgłasza z podaniem pozycji, zamiast po cichu je zmieniać.
Zastosowania
- Naprawa odpowiedzi modelu, zanim trafi do JSON.parse lub do pliku konfiguracyjnego
- Oczyszczenie odpowiedzi, w której JSON otacza blok kodu i wyjaśnienie
- Sprawdzenie, co się zmieniło, aby naprawiona wartość nie trafiła niezauważona na produkcję
Jak używać
- Wklej odpowiedź modelu albo wczytaj przykład.
- Przeczytaj naprawiony JSON i listę zmian pod nim.
- Skopiuj wynik. Zmiany oznaczone na bursztynowo mogą powodować utratę informacji, więc je sprawdź.
Co jest poprawnym JSON-em
- Ciągi znaków i nazwy członków używają wyłącznie cudzysłowów podwójnych. Apostrofy nie należą do gramatyki.
- Nie ma komentarzy. Jedynym dozwolonym wypełnieniem są białe znaki.
- Przecinek stawia się tylko między członkami lub elementami, więc końcowy przecinek jest niedozwolony.
- Wartością jest obiekt, tablica, liczba lub ciąg znaków albo jedno z: false, null i true. Infinity, NaN i undefined nie są wartościami JSON.
- Liczby nie mogą mieć zera na początku ani znaku + na początku, a kropka dziesiętna wymaga cyfr po obu stronach, więc 012, +5, .5 i 5. są niepoprawne.
- Znaki sterujące U+0000 do U+001F wewnątrz ciągu muszą być zapisane jako sekwencje ucieczki, więc surowy znak nowego wiersza w ciągu jest niepoprawny.
- Najwyższy poziom może być dowolną wartością, nie tylko obiektem lub tablicą.
Jak zwykle psuje się wynik modelu
| Problem | Przykład | Co robi to narzędzie |
|---|---|---|
| Blok kodu i towarzyszący tekst | Sure! ```json { … } ``` Hope this helps | Bierze tylko JSON |
| Końcowy przecinek | [1, 2,] | Usuwa przecinek |
| Komentarz | {"a": 1 // note} | Usuwa komentarz |
| Apostrofy | {'a': 'b'} | Używa cudzysłowów podwójnych |
| Klucz bez cudzysłowów | {a: 1} | Ujmuje klucz w cudzysłowy |
| Wartości z Pythona | {"ok": True, "x": None} | Zapisuje true i null |
| Surowy znak nowego wiersza w ciągu | "line one⏎line two" | Zapisuje go jako \n |
| NaN lub undefined | {"x": NaN} | Zapisuje null i ostrzega, że wartość przepadła |
| Ucięta odpowiedź | {"items": [{"id": 1}, {"id": | Domyka to, co jest otwarte, i ostrzega, że mogło zabraknąć danych |
Co można naprawiać bezpiecznie, a czego nie
Naprawa jest bezpieczna, gdy uszkodzony tekst ma tylko jedno rozsądne odczytanie. Końcowy przecinek, komentarz lub blok kodu można usunąć bez zmiany tego, co mówią dane. Inne zmiany zmieniają znaczenie, dlatego są oznaczane i trzeba je sprawdzić: domknięcie uciętej odpowiedzi daje poprawny JSON, w którym brakuje danych, a zamiana NaN na null odrzuca oryginalną wartość.
Dwa ograniczenia wynikają z samego JSON-a. RFC 8259 mówi, że nazwy w obiekcie powinny być unikalne, a zachowanie oprogramowania przy duplikatach jest nieprzewidywalne; to narzędzie zachowuje ostatnią, tak jak JSON.parse. RFC mówi też, że oprogramowanie dobrze współpracuje, gdy nie oczekuje większego zakresu ani precyzji niż liczba podwójnej precyzji IEEE 754. To narzędzie zachowuje liczby tak, jak je zapisano, ale program, który parsuje bardzo długą liczbę całkowitą do liczby podwójnej precyzji, ją zaokrągla. Liczby całkowite od -(2^53)+1 do (2^53)-1 są dokładne.
Lepiej: poproś API o ustrukturyzowane wyjście
Naprawa to rozwiązanie awaryjne. API modeli potrafią ograniczyć wynik do schematu, a trzej dostawcy opisują to inaczej.
- OpenAI: Structured Outputs sprawia, że model generuje odpowiedzi zgodne z twoim schematem JSON Schema, natomiast tryb JSON gwarantuje tylko poprawny JSON. Odmowa może nie być zgodna ze schematem, a odpowiedź, która osiągnie maksymalny limit tokenów, jest niekompletna (status incomplete, powód max_output_tokens).
- Anthropic: dane ustrukturyzowane wykorzystują dekodowanie z ograniczeniami, dzięki czemu odpowiedź jest zgodna ze schematem, a dokumentacja mówi, że w większości przypadków tak jest. Odmowa (stop_reason refusal) lub odpowiedź ucięta przez max_tokens może nie pasować do schematu, więc przed parsowaniem sprawdź stop_reason.
- Google Gemini: model jest skonfigurowany tak, aby tworzył JSON zgodny z podanym schematem. Poprawność semantyczna nie jest gwarantowana, więc sprawdzaj wartości, a niektóre ograniczenia, takie jak minLength i maxLength, nie są egzekwowane.
Żadna z trzech dokumentacji nie obiecuje poprawnego JSON-a, gdy wynik zostanie ucięty. Zanim zaufasz sparsowanemu wynikowi, sprawdź, dlaczego model się zatrzymał.
Źródła (sprawdzono 2026-10-23): RFC 8259: The JavaScript Object Notation (JSON) Data Interchange Format / OpenAI: Structured Outputs / Anthropic: Structured outputs / Google AI for Developers: Structured output
FAQ
Co naprawia?
Usuwa blok kodu i tekst wokół JSON-a; usuwa końcowe przecinki oraz komentarze // lub /* */; zamienia apostrofy i cudzysłowy typograficzne na zwykłe cudzysłowy podwójne; ujmuje w cudzysłowy klucze bez cudzysłowów; zamienia True, False i None na true, false i null; dodaje brakujące przecinki między wierszami; zapisuje surowe znaki nowego wiersza wewnątrz ciągów jako sekwencje ucieczki; oraz przepisuje liczby takie jak +5, .5 i 0x1F na poprawne liczby JSON.
Czego nigdy nie zmienia?
Wartości. Ciągi znaków są zachowane znak po znaku, a liczby zachowują swoje cyfry, więc długi identyfikator, taki jak 12345678901234567890, nie jest zaokrąglany. Zduplikowane klucze działają jak w JSON.parse: wygrywa ostatni.
Co jeśli odpowiedź została ucięta?
Domyka otwarte ciągi, tablice i obiekty oraz usuwa klucz, który nie ma jeszcze wartości. Dzięki temu tekst jest poprawny, ale niekompletny, więc wynik jest oznaczony jako możliwie pozbawiony części danych. Zamiast ufać ucięciu, poproś model o kontynuację albo podnieś jego limit wyjścia.
Dlaczego NaN lub undefined zamieniło się w null?
JSON nie zna NaN, Infinity ani undefined. Narzędzie wpisuje w ich miejsce null i zaznacza to, ponieważ oryginalna wartość przepada.
Dlaczego odmawia przetworzenia niektórych danych?
Gdy nie ma jednego oczywistego rozwiązania, na przykład gdy wielokropek (...) zastępuje pominięte elementy albo gdzie powinna być wartość, stoi samo słowo, narzędzie się zatrzymuje i pokazuje miejsce, zamiast zgadywać.
Czy tekst jest wysyłany na serwer?
Nie. Naprawa odbywa się w twojej przeglądarce.