Deserializacja JSONa

0

Mam problem z deserializacją stringu w JSONie. Otrzymuje z serwera coś takiego:

{
  "5": [],

  "7": {"17": "Text1" },

  "11": {"22": "Text2" },

  "15": { "26": "Text3" }
}

Korzystam z Newtonsoft.Json i deserializuję to do

Dictionary<string, Dictionary<string, string>> parametry

Wszystko gra dopóki nie pojawi się pusty array zamiast obietku. Widzicie jakiś sposób jak mozna by to obejść?

Z góry dziękuję

0

Czemu nie deserializujesz tego do obiektów zamiast do kolekcji stringów ?

0

Kolekcja par słowo kluczowe i wartość wydała mi się najbardziej pasującym obiektem (słowa kluczowe mogą być integerami, ale to detal). Co innego byś proponował?

1

No proponowałbym swoją włąsną klasę/klasy pasującą do schematu JSON'a. To twój własny serwer? Bo te dane wyglądają dziwnie.

0

Serwer jest sklepu internetowego. Oczywiście, że tworzę własną klasę. a ta kolekcja kolekcji to tylko jej element(pokazuję tylko fragment jsona). Problem polega na tym, że odpowiedzi serwera są niekonsekwentne. raz jest to obiekt a raz pusty array [], zamiast pusty obiekt {}.
Jaki obiekt pasowałby do tego schematu? Jedyne co mi przyszło do głowy to grzebanie w stringu i podmiana właśnie [] na {}.

0

no to w takim razie parsowałbym tego jsona według jakichś reguł do akceptowalnego formatu, a następnie deserializował na obiekt.

0

O te "JAKIEŚ" reguły właśnie mi chodzi.Nie przychodzi mi do głowy żaden format, który będzie akceptował zarówno obiekt jak i pusty array. Jeśli masz jakiś pomysł to napisz proszę.

0

Pierwsza reguła jest chyba oczywista. Jeśli w danym polu w którym oczekujesz obiektu jest pusta tablica to zamieniasz to na pusty obiekt.

0

A dlaczego dictionary strimg strimg Ci pasuje? Mi bardziej pasuje int int strimg np drzewo kategorii id parentid nazwa albo coś innego co ma sens w domenie sklepu. Nie wiesz co to są za dane?

1

Spróbuj w ten sposób

            var content = "jakis tam json"
            var json = JObject.Parse(content);
            var elements = json.ToObject<Dictionary<int, JToken>>();

Później możesz zrobic foreach w kolekcji elements sprawdzając przy tym czy ma jakaś wartość i ewnetualnie ją odczytać jako słownik

           foreach (var element in elements)
            {
                Console.WriteLine($"Id:{element.Key} HasValue:{element.Value.HasValues}");

                if (element.Value.HasValues)
                {
                    
                    Console.WriteLine($"\n Zawartość słownika {element.Key}");
                    foreach (var dic in element.Value.ToObject<Dictionary<string, String>>())
                    {
                        Console.WriteLine($"Key:{dic.Key} Value:{dic.Value}");
                    }

                    Console.WriteLine("-------------------------------- \n");
                }
            }

Oczywiście do parsowania jsona użyłem Newtonsoft.Json

0

Właśnie tego potrzebowałem, a nie porad typu przemyśl sprawę i znajdź optymalne rozwiązanie.
Wielkie dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1