java + json: как получить элемент из объекта json, который содержит массив объектов {[{}, {}]} - PullRequest
0 голосов
/ 08 декабря 2018

Нужна помощь с Java + JSON.Привет всем!Мне нужно отсортировать данные по названию песни и обеспечить обработку исключительных ситуаций.Мне нужно написать метод, который сортирует данные из файла JSON.Этот метод также должен иметь возможность сортировать данные, например, с теми же полями.Разбор этого файла работает.Но он имеет структуру:

{
    "musicAlbum": [
        {
            "groupname": "twenty one pilots",
            "songduration": 3.27,
            "songname": "Heathens"
        },
        {
            "groupname": "twenty one pilots",
            "songduration": 4.4,
            "songname": "Car Radio"
        },
        {
            "groupname": "Linkin Park",
            "songduration": 3.06,
            "songname": "Numb"
        }
    ]
}

, и я не знаю, как получить какой-либо элемент из массива объектов.Например, когда я пытаюсь сделать: .getSongName (), я получаю «null».

У меня есть класс Record with String groupName;String songName;и двойной songDuration;все гетеры и сеттеры.Также класс JsonParser с методом разбора.И MusicAlbum класс со списком альбомов.А также класс с main:

import java.io.IOException;
import java.util.List;

public class App {
public static void main(String[] args) throws IOException // exception to be 
handled
{
    List<Record> album = JsonParser.parseJson();
    System.out.println(album); 

    for (int i = 0; i < album.size(); i++) {
        System.out.println(album.get(i));
    }
    Record songName = new Record();
    System.out.println(songName); 
    System.out.println(songName.getSongName());

}
}

Что у меня сейчас в консоли:

[MusicAlbum [album=[Record [groupName=twenty one pilots, songName=Heathens, songDuration=3.27] , Record [groupName=twenty one pilots, songName=Car Radio, songDuration=4.4] , Record [groupName=Linkin Park, songName=Numb, songDuration=3.06] , Record [groupName=Lana Del Rey, songName=Summertime sadness, songDuration=3.56] , Record [groupName=Imagine Dragons, songName=Thunder, songDuration=3.24] , Record [groupName=Three Days Grace, songName=Outsider, songDuration=2.43] , Record [groupName=ONUKA, songName=When I Met You, songDuration=4.04] , Record [groupName=Foster The People, songName=Best Friend, songDuration=4.25] , Record [groupName=Massive Attack, songName=Angel, songDuration=6.18] , Record [groupName=Florence + The Machine, songName=Big God, songDuration=4.28] , Record [groupName=Die antwoord, songName=banana brain, songDuration=7.12] , Record [groupName=Coldplay, songName=Hypnotised, songDuration=5.54] ]]]

MusicAlbum [album=[Record [groupName=twenty one pilots, songName=Heathens, songDuration=3.27] , Record [groupName=twenty one pilots, songName=Car Radio, songDuration=4.4] , Record [groupName=Linkin Park, songName=Numb, songDuration=3.06] , Record [groupName=Lana Del Rey, songName=Summertime sadness, songDuration=3.56] , Record [groupName=Imagine Dragons, songName=Thunder, songDuration=3.24] , Record [groupName=Three Days Grace, songName=Outsider, songDuration=2.43] , Record [groupName=ONUKA, songName=When I Met You, songDuration=4.04] , Record [groupName=Foster The People, songName=Best Friend, songDuration=4.25] , Record [groupName=Massive Attack, songName=Angel, songDuration=6.18] , Record [groupName=Florence + The Machine, songName=Big God, songDuration=4.28] , Record [groupName=Die antwoord, songName=banana brain, songDuration=7.12] , Record [groupName=Coldplay, songName=Hypnotised, songDuration=5.54] ]]

Record [groupName=null, songName=null, songDuration=0.0] 

null

И я понятия не имею, что делать и как написать метод дляполучение данных.

Спасибо за любую помощь с этим методом!

Ответы [ 2 ]

0 голосов
/ 08 декабря 2018

Хорошо, без более подробной информации о вашем Record классе и вашем анализаторе, я могу сделать только некоторый реверс-инжиниринг.

Так выглядят ваши данные.

MusicAlbum [
    album= [
        Record [groupName=twenty one pilots, songName=Heathens, songDuration=3.27] ,
        Record [groupName=twenty one pilots, songName=Car Radio, songDuration=4.4] ,
        Record [groupName=Linkin Park, songName=Numb, songDuration=3.06] ,
        Record [groupName=Lana Del Rey, songName=Summertime sadness, songDuration=3.56] ,
        Record [groupName=Imagine Dragons, songName=Thunder, songDuration=3.24] ,
        Record [groupName=Three Days Grace, songName=Outsider, songDuration=2.43] ,
        Record [groupName=ONUKA, songName=When I Met You, songDuration=4.04] ,
        Record [groupName=Foster The People, songName=Best Friend, songDuration=4.25] ,
        Record [groupName=Massive Attack, songName=Angel, songDuration=6.18] ,
        Record [groupName=Florence + The Machine, songName=Big God, songDuration=4.28] ,
        Record [groupName=Die antwoord, songName=banana brain, songDuration=7.12] , Record [groupName=Coldplay, songName=Hypnotised, songDuration=5.54]
    ]
]

AMusicAlbum имеет массив records, и каждая запись имеет несколько полей, songName является одним из них.

Итак, общий алгоритм для получения подробностей записи будет выглядеть примерно так:

List<Album> albums = parseJson("{...}");
for (Album album : albums) {
    // 'album' is a bad name here, it's storing records, not albums
    List<Record> records = album.getAlbum();
    for (Record record : records) {
        System.out.println(record.getSonName());
    }
}

Это в основном псевдокод, он не скомпилируется, просто чтобы дать вам представление.

0 голосов
/ 08 декабря 2018

Вы не добавляете никаких значений в свой объект songName:

Record songName = new Record(); // you should add values to "songName" object
System.out.println(songName); 
System.out.println(songName.getSongName());

Следовательно, все равно нулю.Попробуйте сделать что-то вроде этого:

Добавьте свой ответ "musicAlbum" к объекту JSONArray, затем выполните итерацию по этому массиву и получите каждую запись.

List<Record> records = new ArrayList<>();
Record record = new Record();

for (int i=0;i<jsonArray.length();i++) {
    JSONObject jObj = jsonArray.getJSONObject(i);

    record.setGroupName = jObj.getString("groupname");
    record.setSongName = jObj.getString("songname");
    record.setSongDuration = jObj.getString("songduration");

    records.add(record);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...