Mam ciąg JSON, który otrzymałem z tabeli, oto mój JSON

    {"subtitle":"Information","desc":"Hi, Welcome.\\n                            <br><br>\\n                            You can access our website <a href=\\"https://test.com\\">here</a>.\\n                            <br><br>\\n                            Dont forget, cost: only $2! \\n                            <br>\\n                            <br>\\n                            <br>\\n                            <br>\\n                            Thankyou,<br>\\n                            Regards"}

Kiedy próbuję wykonać json.parse(), ale pojawił się błąd

SyntaxError: Nieoczekiwany token h w formacie JSON na pozycji 154 .

Myślałem, że to spowodowane cudzysłowami " w adresie URL lub dwukropku :.

Jak mogę przekazać je do JSON?

Aktualizacja

Oto jak uzyskałem dane:

var body_inbox = {};
body_inbox.subtitle = 'Information';
body_inbox.desc = `Hi, Welcome.
                    <br><br>
                    You can access our website <a href="https://test.com">here</a>.
                    <br><br>
                    Dont forget, cost: only $2!
                    <br>
                    <br>
                    <br>
                    <br>
                    Thankyou,<br>
                    Regards`;

body_inbox = JSON.stringify(body_inbox);

Jestem zdezorientowany, znalazłem wiele danych w tabeli, które mają podwójny lewy ukośnik w nowej linii \\n i adresie URL <a href=\\"https://test.com\\">here</a>. Po prostu próbuję utworzyć nowe dane za pomocą JSON.stringify, a wynik to \n i <a href=\"https://test.com\">here</a>. Dlaczego to się dzieje?

Uwaga

Przepraszamy, wprowadzono w błąd, że wcześniejsze dane są literówką.

Powinien być <a href=\\"https://test.com\\">, a nie <a href="\\https://test.com\\">

2
Blackjack 2 kwiecień 2020, 07:56

4 odpowiedzi

Najlepsza odpowiedź

Podwójne ukośniki odwrotne powinny być pojedynczymi ukośnikami odwrotnymi. Pojedynczy odwrotny ukośnik ucieka następny znak, więc to, co robisz z podwójnym, jest unikaniem drugiego odwrotnego ukośnika. Dławi się na href, ponieważ następujący po nim cudzysłów kończy ciąg, po czym parser uderza w „h” w adresie URL jako nieprzetworzony znak.

{ message: "...our website <a href=\\"https://test.com\\">here</a>" }
//                                   ^ parser thinks the string ends here
//                                     and doesn't know what to make of
//                                     https://...

Domyślam się, że dane zostały dwukrotnie usunięte przez dwa różne procesy (lub ten sam proces był dwukrotnie uruchamiany).

Hipotetyczny przykład: dane są tworzone, a po drodze do bazy danych są usuwane. Więc teraz wszystkie cudzysłowy są poprzedzone odwrotnym ukośnikiem. Następnie dokonuje się edycji danych, rekord jest aktualizowany w bazie danych, a ucieczka zostaje ponownie uruchomiona. Ale łańcuch wejściowy zawiera już ukośniki odwrotne od pierwszego razu, a ponieważ same ukośniki odwrotne są wyjątkowe i muszą zostać zmienione, kiedy ciąg znaków zostaje zmieniony (ponownie) w drodze z powrotem do bazy danych, kończy się to z podwójnymi ukośnikami odwrotnymi.

Możesz zobaczyć tego typu rzeczy, dwukrotnie zmieniając znaczenie łańcucha w konsoli. (To nie jest wykonywanie odwrotnych ukośników, ale pokazuje problem):

const input = '"This string is quoted."';

const once = encodeURI(input);
// encodes the quotes as '%22'
// "%22This%20string%20is%20quoted.%22"

const twice = encodeURI(once);
// encodes the '%' in '%22' as '%25', and you end up with `%2522`
// "%2522This%2520string%2520is%2520quoted.%2522"
2
ray hatfield 2 kwiecień 2020, 20:41

(opublikowano odpowiedź od autora pytania, aby przenieść ją do przestrzeni odpowiedzi) .

Bardzo dziękuję za wszystkie odpowiedzi. Pomogło to w ustaleniu, że analiza nie powiodła się z powodu podwójnego odwrotnego ukośnika, który wymyka się drugiemu ukośnikowi odwrotnemu, a nie podwójnemu cudzysłowowi ".

Dane mają podwójny lewy ukośnik, ponieważ są to dane ze sklonowanej bazy danych, myślałem, że dzieje się to podczas konwersji do pliku SQL.

0
halfer 9 kwiecień 2020, 12:12

Użyj ciągu szablonu, aby zapisać dane.

const json = `{"subtitle":"Information","desc":"Hi, Welcome.\\n<br><br>\\nYou can access our website <a href=\\"https://test.com\\">here</a>.\\n<br><br>\\nDont forget, cost: only $2!\\n<br>\\n<br>\\n<br>\\n<br>\\n Thankyou,<br>\\n Regards"}`
console.log(JSON.parse(json))
2
xdeepakv 2 kwiecień 2020, 05:31

Podwójne cudzysłowy w json (w wartości) wymagają tylko jednego ukośnika (\). Więc twój json powinien być

{"subtitle":"Information","desc":"Hi, Welcome.\\n                            <br><br>\\n                            You can access our website <a href=\"https://test.com\">here</a>.\\n                            <br><br>\\n                            Dont forget, cost: only $2! \\n                            <br>\\n                            <br>\\n                            <br>\\n                            <br>\\n                            Thankyou,<br>\\n                            Regards"}
2
Vivek Molkar 2 kwiecień 2020, 05:09