• 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

+1 głos
184 wizyt
pytanie zadane 23 października 2021 w Java przez DzikieHarce Użytkownik (510 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ź

+1 głos
odpowiedź 23 października 2021 przez Wiciorny Ekspert (221,970 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 (510 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 (221,970 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 (510 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 (221,970 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 (510 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,391 wizyt
pytanie zadane 4 grudnia 2018 w Java przez mn130496 Gaduła (3,510 p.)
0 głosów
1 odpowiedź 599 wizyt
pytanie zadane 8 lutego 2017 w C# przez Zychu Użytkownik (710 p.)
+1 głos
1 odpowiedź 60 wizyt
pytanie zadane 29 czerwca 2021 w Java przez Lulex Użytkownik (670 p.)

88,355 zapytań

136,952 odpowiedzi

305,666 komentarzy

58,618 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...