Deserializacja obiektu, który zawiera cudzysłów

Deserializacja obiektu, który zawiera cudzysłów
AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2181
0

Witam.
Co ja jeszcze muszę zrobić żeby taki zapis się deserializował?

Kopiuj
string test = "{\"Value\":\"Towar w \"Ciapki\" Test, długa nazwa\", \"Style\":{}}";

var d = JsonSerializer.Deserialize<TableData>(test);

// Klasa TableData
public class TableData
{
  [JsonPropertyName("Style")]
  public Style Style { get; set; } = new();
  [JsonPropertyName("Value")]
  public string Value { get; set; }
}

Treść błędu

Kopiuj
System.Text.Json.JsonException: ''C' is invalid after a value. Expected either ',', '}', or ']'. Path: $ | LineNumber: 0 | BytePositionInLine: 19.'

Próbowałem jeszcze tego poniżej, ale wynik dodaje kolejne \\\ i efekt końcowy jest ten sam - nie działa

Kopiuj
HttpUtility.JavaScriptStringEncode(test)
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
1
AdamWox napisał(a):

Próbowałem jeszcze tego poniżej, ale wynik dodaje kolejne \\\ i efekt końcowy jest ten sam - nie działa

działa jak najbardziej

Kopiuj
string test = "{\"Value\":\"Towar w \\\"Ciapki\\\" Test, długa nazwa\", \"Style\":{}}";

ale łatwiej użyć @:

Kopiuj
string test = @"{""Value"":""Towar w \""Ciapki\"" Test, długa nazwa"", ""Style"":{}}";

albo do json najlepiej """:

Kopiuj
string test = """
    {"Value":"Towar w \"Ciapki\" Test, długa nazwa", "Style":{}}
    """;
AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2181
0

Mi ten obiekt przychodzi do API z frontu. Ja nie mam takiego stringa, że mogę sobie "małpę" dodać, albo cudzysłów 3 razy. Owszem nie napisałem o tym, ale raczej nikt takich statycznych stringów nie deserializuje.

Przepuszczenie przez HttpUtility daje taki wynik

Kopiuj
"{\\\"Value\\\":\\\"Towar w \\\"Ciapki\\\" Test, długa nazwa\\\", \\\"Style\\\":{}}"

A to zwraca błąd

Kopiuj
System.Text.Json.JsonException: ''\' is an invalid start of a property name. Expected a '"'. Path: $ | LineNumber: 0 | BytePositionInLine: 1.'
obscurity
  • Rejestracja: dni
  • Ostatnio: dni
3
AdamWox napisał(a):

Owszem nie napisałem o tym, ale raczej nikt takich statycznych stringów nie deserializuje.

No to też chciałem napisać że robisz jakieś dziwne rzeczy i że normalnie stringi przychodzą np z API i tam nie ma takich problemów, ale założyłem że może potrzebne ci to np do testów więc się nie czepiałem.

Jak przychodzi z API to nic nie musisz z tym robić, po prostu string który przychodzi ma tak wyglądać:

{"Value":"Towar w \"Ciapki\" Test, długa nazwa", "Style":{}}

a w IDE w podglądaniu wartości prawdopodobnie zobaczysz dodatkowe ukośniki i wtedy powinieneś zobaczyć coś w stylu:

{\"Value\":"Towar w \\\\"Ciapki\\\" Test, długa nazwa\", \"Style\":{}}

Jak chcesz podejrzeć niezmodyfikowany string w IDE to kliknij na lupkę "View" i obejrzyj wartość w oknie "Text Visualizer" - wtedy łatwiej ogarnąć te ukośniki. Tak to powinno wyglądać:

screenshot-20250929220620.png

i czemu z frontu przychodzi JSON w postaci stringa? Czemu nie przesyłasz obiektu jako JSON, normalnie framework powinien się zajmować takimi rzeczami

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2181
0

No to chyba brakuje ukośników, bo visualizer mi pokazuje taki string
Zrzut ekranu 2025-09-29 221437.png

i czemu z frontu przychodzi JSON w postaci stringa? Czemu nie przesyłasz obiektu jako JSON, normalnie framework powinien się zajmować takimi rzeczami

Za dużo pisania dlaczego tak 😅 ale tak musi być

obscurity
  • Rejestracja: dni
  • Ostatnio: dni
2

no brakuje, cudzysłowy w "Ciapki" powinny być escapowane bo inaczej to po prostu błędny JSON, nie da się go naprawić po stronie backendu, można jedynie zgadywać bo nie ma tu rozróżnienia końca stringa od cudzysłowu wewnątrz. Wróć na frontend i tam popraw

AdamWox
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Jastrzębie-Zdrój
  • Postów: 2181
0

Nakierowałeś mnie gdzie problem występuje tym brakiem escape'powanych "Ciapków".

Po krótce...
To wszystko jest pod system wydruków. Tworzę edytor na froncie, który generuje JSONa i później tego JSONa przerabiam na PDFa za pomocą QuestPdf. Każdy element może mieć swoje zapytanie SQLowe, które jest wywoływane i odpowiednio formatowane na JSON z wynikiem jakie te zapytanie zwraca. Problem był w funkcji, która odpytuje bazę i zwraca właśnie taki string jak wyżej. W tej funkcji brakowało escape'owania ciapków. A w polu "Value" o wartości "Towar w \"Ciapki\" Test, długa nazwa" jest nazwą towaru, która została celowo nadana, aby z takimi problemami sobie jakoś poradzić. Przeważnie tyczy się to towarów, które mają cale (inch) w nazwie i często z tego powodu są problemy.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.