Nieprawidłowy wynik parsowania jsona

Nieprawidłowy wynik parsowania jsona
G1
  • Rejestracja:około 4 lata
  • Ostatnio:23 dni
  • Postów:504
0

Witam. W kontrolerze mam Model:

Kopiuj
public class MachineDetailTableRowModel
    {
        public string MachineName { get; set; }
        
        public string ConcentrationValue { get; set; }
        public string ConcentrationColor { get; set; }
        public MachineReport.eLevelState PhLevelState { get; set; }
        public string PhValue { get; set; }
        public string PhColor { get; set; }
        public MachineReport.eLevelState TrampOilLevelState { get; set; }
        public string TrampOilValue { get; set; }
        public string TrampOilColor { get; set; }
        public string CleanOutDate { get; set; }
        public bool OnlySummaryData { get; set; } = false;
        public MachineComment[] LastReportComments { get; set; }
    }
public class MachineComment
    {
        public string Date { get; set; }
        public string Comment { get; set; }
        public string CircleColor { get; set; }
    }

i akcję kontrolera zwracającą widok częściowy:

Kopiuj
        [Authorize]
        [Route("GenerateMachineDetailTableRow")]
        public IActionResult GenerateMachineDetailTableRow(MachineDetailTableRowModel Model)
        {
            _logger.LogInformation(JsonConvert.SerializeObject(Model));
            return PartialView("ReportGenerator/_MachineDetailTableRow", Model);
        }

Skrypt js generuje następujące dane:

Kopiuj
var data = {
                MachineName: machineData.machineName,
                ConcentrationValue: machineData.concentrationValue,
                ConcentrationColor: machineData.concentrationColor,
                PhValue: machineData.phValue,
                PhColor: machineData.phColor,
                TrampOilValue: machineData.trampOilValue,
                TrampOilColor: machineData.trampOilColor,
                CleanOutDate: machineData.cleanOutDate,
                LastReportComments: machineData.commentsFromLastReport.map(function(value, label){
                    return {
                        CircleColor: value.circleColor,
                        Comment: value.Comment,
                        Date: value.date
                    }
                }),
                OnlySummaryData: onlySummaryData,
            };
        console.log(data);
        var htmlData = $.ajax({
            url: '/ReportGenerator/GenerateMachineDetailTableRow',
            data: data,
            ...

Pole w skrypcie o nazwie poniżej jest wypełnione poprawnie, jednak po przekazaniu do modelu otrzymuję pustą tablicę. Próbowałem wyrzucić obiekt MachineComment i wstawić tablicę typu string[], z tym samym skutkiem. Gdzie może leżeć błąd? Dodam, że problem jest tylko i wyłącznie z LastReportComments

Kopiuj
LastReportComments
edytowany 3x, ostatnio: Riddle
Xarviel
  • Rejestracja:ponad 3 lata
  • Ostatnio:około 2 godziny
  • Postów:847
1

Od strony Javascriptu musisz zamienić zmienną data przed wysłaniem w JSON i uzupełnić pole type / dataType.

Kopiuj
const htmlData = $.ajax({
  type: 'post',
  url: '/ReportGenerator/GenerateMachineDetailTableRow',
  data: JSON.stringify(data),
  dataType: 'json',
  // ...
});
edytowany 1x, ostatnio: Xarviel
G1
  • Rejestracja:około 4 lata
  • Ostatnio:23 dni
  • Postów:504
0

Zmieniłem dataType: 'json', ale bez wstawiania data: JSON.stringify(data),, ponieważ wtedy już żadna z właściwości nie pobiera wartości. problem mam tylko z niepoprawnym konwertowaniem tablicy (pierwszy raz coś takiego mi się zdarza).

Xarviel
JSON.stringify raczej na 99% musi być, bo sama metoda podczas wysyłania tego nie zamienia. Jeszcze jakiś problem jest po stronie c# ale z tym nie pomogę :P
_13th_Dragon
A może jakiś przykładowy JSON w postaci pliku/tekstu? Może sprawdź dane pod kątem poprawności, np: https://jsonlint.com/
G1
  • Rejestracja:około 4 lata
  • Ostatnio:23 dni
  • Postów:504
0

Cały obiekt jest prawidłowo widoczny. Mam go w kontrolerze. Jedyne co to ta jedna właściwość. Wszystkie nazwy się zgadzają. Wygląda jakby sama tablica nie zostawała rozpoznana. To jest impossible

_13th_Dragon
Właśnie dla tego proponuje wrzucić to do sprawdzarki, bo jak ci tam jakiś lewy znaczek się wstawił np zamiast " to wizualnie ciężko zauważyć.
G1
@_13th_Dragon: +1, wroce do domu i looknę tam :P
G1
  • Rejestracja:około 4 lata
  • Ostatnio:23 dni
  • Postów:504
0

@_13th_Dragon: à propos tej stronki to może źle powiedziałem troszkę. Nie dysponuję jako tako jsonem. Mam obiekty tutaj, które widzę w przeglądarce w podglądzie, że są utworzone prawidłowo

Kopiuj
LastReportComments: machineData.commentsFromLastReport.map(function(value, label){
  return {
    CircleColor: value.circleColor,
    Comment: value.Comment,
    Date: value.date
  }
}),

Po sprawdzeniu w przeglądarce mają poprawne wartości. Przy przesłaniu do kontrolera debugger pokazuje mi pustą tablicę. Co lepsze, jak spróbuje wysłać to do kontrolera jako tekst i zdeserializuję JsonConvert.Deserializeobject() to wszystkie wartości są poprawne, ale to nieeleganckie :( tak więc argumenty wysyłane do kontrolera są w 100% poprawne

edytowany 1x, ostatnio: gswidwa1
_13th_Dragon
Czy kontroler dostaje napis w formacie JSON?
G1
Nie, wstawiłem kod na samym początku 😁 poniżej już jest rozwiązanie. Dziękuję Tobie również bardzo za pomoc!
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 2 godziny
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
2

A masz w Program.cs wpis żeby używać Newtonsoft.Json?

Kopiuj
builder.Services.AddControllers().AddNewtonsoftJson();

Domyślny System.Text.Json już nie raz miał problemy z prostymi zadaniami.

G1
Dziękuję, chodzi tak jak powinno!
G1
Przepraszam, że dopisuję do zamkniętego tematu. Dodatkowym problemem było jeszcze to, że wykonywałem metodę get, a nie post. Tablica w postaci json próbowała dopisać się do query parametr, co zamieniało niektóre znaki i finalnie ciąg przesłany do kontrolera w ogóle nie przypominał jsona. Tak, gdyby ktoś kiedyś tu wrócił zostawiam :)
heyyou
  • Rejestracja:ponad 6 lat
  • Ostatnio:16 dni
  • Postów:181
0
AdamWox napisał(a):

A masz w Program.cs wpis żeby używać Newtonsoft.Json?

Kopiuj
builder.Services.AddControllers().AddNewtonsoftJson();

Domyślny System.Text.Json już nie raz miał problemy z prostymi zadaniami.

jakis przyklad :)?
wystarczy uzywac jak w dokumentacji

nawet jesli, to nie od razu rzym zbudowano (ewentualnie spalono) :D, jest problem, to sie zglasza issue
az mi sie przypomina jak entity framework core nie mial lazy loading bodajze =D

uzaleznianie czezsto modeli bazodanowych od zewnetrznych bibliotek (newtonsoft.json) to porazka, dlatego powinno sie przechodzic na system.text.json
nigdy nie mialem problemu z ta juz standardowo libka

edytowany 3x, ostatnio: heyyou
ZD
Możesz to zserializowac po polsku ?
heyyou
a czego konkretnie nie zrozumiales to wytlumacze :(
G1
Newtonsoft mnie jeszcze nigdy nie zawiódł
somekind
EF może i ma lazy loading, ale nadal ssie.
SA
  • Rejestracja:około 12 lat
  • Ostatnio:około godziny
  • Postów:1427
1
heyyou napisał(a):

uzaleznianie czezsto modeli bazodanowych od zewnetrznych bibliotek (newtonsoft.json) to porazka, dlatego powinno sie przechodzic na system.text.json
nigdy nie mialem problemu z ta juz standardowo libka

Ktoś coś pisał o bazach danych? I w czym ta przewaga System.Text.Json się przejawia? Bo na pewno Newtonsoft jest rozwiązaniem dojrzalszym, bardziej sprawdzonym, bardziej elastycznym (wygodne budowanie i modyfikacja JSON), ludzie go znają i są zadowoleni (jak widać powyżej). Lepsze jest wrogiem dobrego.

heyyou
  • Rejestracja:ponad 6 lat
  • Ostatnio:16 dni
  • Postów:181
0

tym ze czesto widuje atrybuty serializacji w encjach bazodanowych z zewnetrznej biblioteki (tu newtonsfot.json)
uzaleznienie czegokolwiek (viewmodeli, dto) od zewnetrznej libki tez jest słabe imho

btw. newtonsoftjson w performance jest o wiele slabszy z tego co kojarze ;)

za komuny tez niektorym bylo dobrze, takze ten...

edytowany 2x, ostatnio: heyyou
heyyou
zeby nie byc goloslownym 1 link z brzegu https://inspiration.nlogic.ca/en/a-comparison-of-newtonsoft.json-and-system.text.json aczkolwiek nie ten art czytalem kiedys ;)
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Wrocław
0
heyyou napisał(a):

uzaleznianie czezsto modeli bazodanowych od zewnetrznych bibliotek (newtonsoft.json) to porazka, dlatego powinno sie przechodzic na system.text.json

Z punktu widzenia modelu (jakiegokolwiek), to System.Text.Json jest równie obcy jak Newtonsoft.Json. Jeśli MS przyznaje, że ich wersja nie wspiera wszystkiego tego, co Newtonsoft, to migracja jest ryzykowna, no chyba że liczymy na farta, że nigdy nie będziemy potrzebowali nic spoza tego kawałka, który przypadkiem zaimplementowali.

obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
0
somekind napisał(a):

Jeśli MS przyznaje, że ich wersja nie wspiera wszystkiego tego, co Newtonsoft, to migracja jest ryzykowna, no chyba że liczymy na farta, że nigdy nie będziemy potrzebowali nic spoza tego kawałka, który przypadkiem zaimplementowali.

Implementacja System.Text.Json w najnowszym .necie ma już wszystko czego potrzeba i jest znacznie szybsza; jeśli czegoś nie zaimplementowano to zazwyczaj dlatego że ten feature wykraczał poza granice przyzwoitości i nie powinien istnieć - można znaleźć dużo dyskusji na githubie i dokładnych tłumaczeń czemu czegoś nie przenieśli. Jeśli polegałeś na tych "kawałkach" to zazwyczaj oznacza że gryzłeś problem od d**y strony i pora się naprostować. Jasne że deserializator może przy okazji deserializacji ugotować zupę, zrobić audyt bezpieczeństwa i przetłumaczyć tekst na japoński, ale czy to najlepsze miejsce w kodzie żeby to zrobić?


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
G1
Ugotować zupę 🤣, to już nie potrzebuje kobiety 😁🍻
somekind
Moderator
  • Rejestracja:około 17 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Wrocław
4
obscurity napisał(a):

Implementacja System.Text.Json w najnowszym .necie ma już wszystko czego potrzeba i jest znacznie szybsza;

Ale skąd wiesz, czego mi potrzeba?

jeśli czegoś nie zaimplementowano to zazwyczaj dlatego że ten feature wykraczał poza granice przyzwoitości i nie powinien istnieć - można znaleźć dużo dyskusji na githubie i dokładnych tłumaczeń czemu czegoś nie przenieśli. Jeśli polegałeś na tych "kawałkach" to zazwyczaj oznacza że gryzłeś problem od d**y strony i pora się naprostować.

Tak, oczywiście. Jeśli soft czegoś nie wspiera, to jest to wina użytkownika.
Pracujesz na Maku? ;)

Jasne że deserializator może przy okazji deserializacji ugotować zupę, zrobić audyt bezpieczeństwa i przetłumaczyć tekst na japoński, ale czy to najlepsze miejsce w kodzie żeby to zrobić?

Jakoś nie widzę gotowania zupy na tej liście, w ogóle nie widzę rzeczy z serializacją niezwiązanych:
screenshot-20221109114003.png
źródło

Nie mówię, że System.Text.Json jest zły, żeby go nie używać, czy żeby nie migrować. Po prostu trzeba to robić z głową, będąc pewnym, że albo wspiera czego potrzebujemy OOB, albo że mamy czas na dorobienie sobie brakujących nam ficzerów.

edytowany 1x, ostatnio: somekind
_13th_Dragon
"Ale skąd wiesz, czego mi potrzeba?" - nie wydaje mi się abyś potrzebował aby JSON dzieci robił, oraz inne czynności co normalnie do JSON'a nie należą.
SO
Są za to na liście rzeczy, które nie są wspierane, bo nie są zgodne ze specyfikacją JSONa albo są ogólnie uważane za niebezpieczne i złe paktyki ;) To raczej na plus, ale zgadzam się, że przy migracji trzeba na to uważać. Przy tworzeniu nowego softu nie widzę sensu w używaniu Newtonsoft.Json poza skrajnymi przypadkami, które wymagają czegoś z tej listy.
obscurity
  • Rejestracja:około 6 lat
  • Ostatnio:dzień
1
somekind napisał(a):

źródło

A teraz kliknij sobie na "Not supported" i przy każdym masz wyjaśnienie. Trzy środkowe tyczą się nieprawidłowego JSONa niezgodnego ze standardem który Newtonsoft ignorował.
Ostatnie tyczy się tego że ludzie chcą przesyłać teksty dłuższe niż 125MB i tablice większe niż kilka milionów elementów. Może... ale tylko może - JSON nie jest najlepszym formatem do serializowania całej bazy danych i przesyłania plików binarnych? Rozumiem że ktoś może tego potrzebować bo tak jest łatwiej, ale raczej imo json powinien zawierać tylko linki lub id plików niż ich całą treść.

Jedyne z listy czego naprawdę brakuje to obsługa JsonPath, ale tę można sobie chwilowo załatwić za pomocą 3rd party paczek nugetowych, tak samo można zrobić z "Support for System.Runtime.Serialization attributes" czego już nie dodadzą bo zepsuło by to kompatybilność wsteczną. Reszta to nie tyle niewspierane funkcje co intencjonalna zmiana zachowania względem newtonsoftu.

Może to nie jest najlepsza pora na migrację, jeszcze dużo będzie zrobione w .NET 8 https://github.com/dotnet/runtime/issues/77020 ale nie ma moim zdaniem żadnych powodów żeby rekomendować używanie newtona w nowych projektach


"A car won't take your job, another horse driving a car will." - Horse influencer, 1910
edytowany 2x, ostatnio: obscurity
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)