• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wczytywanie danych z json do listy obiektów - java

Object Storage Arubacloud
+1 głos
819 wizyt
pytanie zadane 23 października 2021 w Java przez DzikieHarce Użytkownik (690 p.)

Stworzyłam funkcję która ma za zadanie wczytać dane z pliku .json do jednokierunkowej listy obiektów. Problem z tym że wyskakuje mi błąd: Exception in thread "main" java.lang.ClassCastException: class org.json.simple.JSONObject cannot be cast to class org.json.simple.JSONArray . Chodzi mi o to, żebym w klasie ShoppingLisy utworzyła listę: 

 ArrayList<Ingredients> ShoppingList = new ArrayList<Ingredients>();

obiektów klasy ingredient. Wyświetlanie jej i inne operacje działają (testowałam na dwóch obiektach stworzonych "ręcznie", i dodanych za pomocą funkcji.) Chciałabym jednak wczytywać i zapisywać do niej dane z pliku. Oto kod:

 public void LoadList(){
        JSONParser jsonParser = new JSONParser();
         try
         {
             FileReader reader = new FileReader("E:\\Java\\Ekoszyk-projekt\\data1.json");
             Object obj = jsonParser.parse(reader);
 
            JSONArray List = (JSONArray) obj;
            System.out.println(List);
            List.forEach( emp -> parseObject( (JSONObject) emp ) );
         }catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }
    private static void parseObject(JSONObject ingredient) 
    {
       
        JSONObject ingredientObject = (JSONObject) ingredient.get("ingredient");
         
        String ingredientName = (String) ingredientObject.get("ingredientName");    
        System.out.println(ingredientName);
         
        
        String ingredientAmount = (String) ingredientObject.get("ingredientAmount");  
        System.out.println(ingredientAmount);
         
      
        String ingredientPrice = (String) ingredientObject.get("ingredientPrice");    
        System.out.println(ingredientPrice);
    }

Błąd wyrzuca przy: JSONArray List = (JSONArray) obj; Wiecie jak to naprawić?

1 odpowiedź

+2 głosów
odpowiedź 23 października 2021 przez Wiciorny Ekspert (269,710 p.)
wybrane 23 października 2021 przez DzikieHarce
 
Najlepsza

 JSONArray List = (JSONArray) obj;

nie możesz rzutować "obiektu" javovego Object na tym JSONArray, bo obiekt nie jest tablicą.  możesz rzutować jedynie obiekt typu JSON. 
Zmienna obj- musi być odpowiedniego typu, nie Object. 
prawidłowo powinno być 

 Object obj = parser.parse(jsonConf);
 JSONObject jsonObject = (JSONObject) obj;

dodatkowo jeśli jednak uwzględniamy tu tablice to nalezy odpowiednio skofirgurować parser npp.

JSONParser parser = new JSONParser();
 ArrayList list = parser.parse(ArrayList.class, obiektJson);

 

natomiast- jeśli twój kod miałby działać, to twój plik musiałby być tablica json zewnętrzenie

 Object obj = jsonParser.parse(reader);
 JSONArray List = (JSONArray) obj;  

zadziała dla tablicy

komentarz 23 października 2021 przez DzikieHarce Użytkownik (690 p.)
Nie rozumiem czym jest jsonConf i czy jsonObject powinno zastąpić List? W takim razie nie będzie problemów z dalszą obsługą, skoro funkcje napisane są pod array?
komentarz 23 października 2021 przez Wiciorny Ekspert (269,710 p.)

jsonConf to po prostu jest jakiś obiekt odczytany... wiesz w ogóle co robi twój kod? Bo to tylko nazwa zmiennej jsonObject zastąpić list tego nie rozumiem, jesli masz listę obiektów json ... to moze to byc JSON array ale w twoim pliku zewnętrznie powinna być lista, a nie obiekty json. 

czyli tak :

[  
    {  
        "name":"John",
        "city":"Berlin",
        "cars":[  
            "audi",
            "bmw"
        ],
        "job":"Teacher"
    },
    {  
        "name":"Mark",
        "city":"Oslo",
        "cars":[  
            "VW",
            "Toyata"
        ],
        "job":"Doctor"
    }
]

wtedy to można rzutować do JSONARRAY natomiast jeśli masz same obiekty, to one nie mogą być bezpośrednio rzutowane do listy 

 

tu masz przykład zarówno dla OBIEKTÓW jak i listy z zpliku https://crunchify.com/how-to-read-json-object-from-file-in-java/

wewnątrz obiektu json, masz TABLICE ... stąd tę tablice możesz rzutować do JsonArray, natomiast sam obiekt musisz do JsonObject

komentarz 23 października 2021 przez DzikieHarce Użytkownik (690 p.)

Myślałam nad stworzeniem jednego ingredient i w tablicy zapisanie jego składników:

{
	"ingredient": [
			{
			"ingredientName": "kapusta",
			"ingredientAmount": 3,
			"ingredientPrice": 4
			},
			{
			"ingredientName": "mieso",
			"ingredientAmount": 34,
			"ingredientPrice": 47
			}
]
}

 

komentarz 23 października 2021 przez Wiciorny Ekspert (269,710 p.)

więc to jest JsonObject, a z niego pobrać musisz tablice ingredient 

Bo w pliku masz tylko 1 obiekt który nie jest tablica, ale posiada wewnątrz tablice

JSONObject jsonObject = (JSONObject) obj;
JSONArray arrayOfIngredient = (JSONArray) jsonObject.get("ingredient");

 

komentarz 23 października 2021 przez DzikieHarce Użytkownik (690 p.)
Wczytywanie działa poprawnie. Dziękuję. A jeśli chciałabym, żeby nie wczytywało tablicy, tylko tworzyło dla każdego składnika oddzielne obiekty typu ingredient, które potem mogłabym dodać do listy, da się to zrobić?

Podobne pytania

0 głosów
1 odpowiedź 1,994 wizyt
pytanie zadane 4 grudnia 2018 w Java przez mn130496 Gaduła (3,530 p.)
0 głosów
1 odpowiedź 754 wizyt
pytanie zadane 8 lutego 2017 w C# przez Zychu Użytkownik (710 p.)
+1 głos
1 odpowiedź 113 wizyt
pytanie zadane 29 czerwca 2021 w Java przez Lulex Użytkownik (820 p.)

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...