Deserializacja JSON, lista z jednym elementem.

0

Witam.

Próbuje zdeserializować komunikaty JSON.
Odpowiedź wygląda tak:

{  
   "AKTYWNY":"TAK",
   "TRESC":"OK",
   "WYNIK":{  
      "ADRES":"11-29",
      "DATA":"2018-11-30",
      "ILOSC":"36"
   }
}

elementów w WYNIK może być kilka:

{  
   "AKTYWNY":"OK",
   "TRESC":"OK",
   "WYNIK":[  
      {  
         "ADRES":"11-8",
         "DATA":"2018-04-22",
         "ILOSC":"36"
      },
      {  
         "ADRES":"11-9",
         "DATA":"2018-11-30",
         "ILOSC":"108"
      }
   ]
}

Stworzyłem klasę:

public static class JSONResponse
{ 
  public string AKTYWNY{ get; set; }
        public string TRESC{ get; set; }
        public List<ElementWyniku> WYNIK { get; set; }

        public class ElementWyniku
        {
            public string ADRES{ get; set; }
            public DateTime DATA { get; set; }
            public double ILOSC { get; set; }
        }
}

i wykonuje deserializacje za pomocą biblioteki Newtonsoft.Json wywołując:

JSONResponse jSONResponse = JsonConvert.DeserializeObject<JSONResponse>(response);

Jeżeli WYNIK zawiera kilka elementów to deserializacja przebiega bez błędów, jednak gdy jest jeden element program zwraca błąd:
screenshot-20180302095544.png

z tego co znalazłem sieci problemem jest to że próbuję jeden element deserializować do 'List'

Jak to można zrobić, żeby błąd wykluczyć?

Z góry dziękuję

1
{  
   "AKTYWNY":"TAK",
   "TRESC":"OK",
   "WYNIK":[
{  
      "ADRES":"11-29",
      "DATA":"2018-11-30",
      "ILOSC":"36"
   }
]
}

Jeśli jest kolekcja to nawet jeśli jest jeden element, muszą być nawiasy kwadratowe.

Chyba, że deserializujesz 2 różne obiekty, ale wtedy pierwszy obiekt powinien wyglądać tak:

public class JSONResponse
{ 
        public string AKTYWNY{ get; set; }
        public string TRESC{ get; set; }
        public ElementWyniku WYNIK { get; set; }
}

0

Ja bym zaczął od zrobienia tych klas niezagnieżdżonymi i niestatycznymi. Nie wiem czy to jest przyczyna, ale wygląda dziwnie.

0

@litrmleka: masz racje.

Jednak obydwa wyniki zwraca ta sama metoda webservice.

Na szybko mogę zrobić tak że zrobię dwie klasy i spróbuje deserializować do listy a jak zwróci błąd to deserializować do pojedynczego obiektu.
To "tylko" obejście na szybko.

Pytanie jak to zrobić prawidłowo?
Webservice jest zewnętrzny więc nie mam na niego wpływu (swoją drogą to że zwraca dane w takiej postaci (tzn raz tak, raz tak) można uznać za błąd?).

@somekind

nie mam pojęcia skąd ten static się tam wziął...
Na dobrą sprawę to się nawet nie skompiluje bo elementy w klasie nie są statyczne :).

0
hipekk napisał(a):

Webservice jest zewnętrzny więc nie mam na niego wpływu (swoją drogą to że zwraca dane w takiej postaci (tzn raz tak, raz tak) można uznać za błąd?).

No ja bym tak uznał i zgłosił to do autorów tego serwisu. Dopasowywanie się do takich cudów jest niefajne, a przecież 1 to tylko szczególny przypadek kolekcji.

0

Póki co poradziłęm sobie prostą zamianą,

                if (!response.Contains("["))
                {                   
                    response = response.Replace("\"WYNIK\":{", "\"WYNIK\":[{").Replace("}}", "}]}");  
                }

a w między czasie poczekam na reakcję autorów serwisu.

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