Библиотека org.json проста в использовании. Пример кода ниже:
import org.json.*;
JSONObject obj = new JSONObject(" .... ");
String pageName = obj.getJSONObject("pageInfo").getString("pageName");
JSONArray arr = obj.getJSONArray("posts");
for (int i = 0; i < arr.length(); i++)
{
String post_id = arr.getJSONObject(i).getString("post_id");
......
}
Вы можете найти больше примеров из: Parse JSON в Java
Загружаемый jar: http: // mvnrepository .com / артефакт / org.json / JSON
readObject()
не возвращает null
в EOF. Вы можете поймать EOFException
и интерпретировать его как EOF, но это не сможет обнаружить отличную нормальную EOF из файла, который был усечен.
Лучшим подходом было бы использование некоторых метаданных. То есть вместо того, чтобы просить ObjectInput
, сколько объектов находится в потоке, вы должны где-то хранить счетчик. Например, вы можете создать класс метаданных, который записывает счет и другие метаданные и сохраняет экземпляр как первый объект в каждом файле. Или вы можете создать специальный класс маркеров EOF и сохранить экземпляр как последний объект в каждом файле.
Лучший возможный путь для завершения цикла можно сделать, добавив нулевой объект в конец. При чтении нулевого объекта можно использовать в качестве граничного условия для выхода из цикла. Захват EOFException также решает цель, но требуется несколько m
Любопытно, что API не предлагает более элегантного решения. Я думаю, что EOFException
будет работать, но мне всегда было предложено видеть исключения как неожиданные события, тогда как здесь вы часто ожидали, что поток объектов завершится. Я попытался обойти это, написав своего рода «маркерный» объект, чтобы обозначить конец потока объектов:
import java.io.Serializable;
public enum ObjectStreamStatus implements Serializable {
EOF
}
Затем в коде, читающем объект, который я проверил для этого объекта EOF в объекте цикл считывания.
Если вы пишете нулевой объект в конце файла, когда вы его прочитаете, вы получите нулевое значение и можете завершить цикл.
Просто добавьте: out.writeObject (null);
при сериализации данных.
Доступный метод ObjectInputStream не может использоваться для завершения цикла, когда он возвращает 0, даже если в файле есть объекты, которые нужно прочитать. Написание нуля в файле doen't кажется хорошим решением, поскольку объекты могут быть нулевыми, которые затем будут интерпретироваться как конец файла. Я думаю, что уловка EOFException для прекращения циклов является лучшей практикой, поскольку, если возникает EOFException (либо из-за того, что вы достигли конца файла, либо по какой-либо другой причине), вы все равно должны завершить цикл.
Нет, вам нужно знать, сколько объектов есть в двоичном файле. Вы можете записать количество объектов в начале файла (например, с помощью writeInt) и прочитать его при загрузке.
Другой вариант - вызвать ois.available () и цикл до тех пор, пока он не вернет 0. Однако я не уверен, что это на 100%.
У меня была такая же проблема сегодня. Хотя вопрос довольно старый, проблема остается, и не было никакого чистого решения. Игнорирование EOFException
следует избегать, поскольку оно может быть выброшено, если какой-либо объект был сохранен неправильно. Написание null, очевидно, не позволяет использовать нулевые значения для любых других целей. Наконец, использование available()
в потоке объектов всегда возвращает ноль, так как количество объектов неизвестно.
Мое решение довольно просто. ObjectInputStream
- это просто оболочка для другого потока, например FileInputStream. Хотя ObjectInputStream.available ()
возвращает ноль, FileInputStream.available вернет некоторое значение.
FileInputStream istream = new FileInputStream(fileName);
ObjectInputStream ois = new ObjectInputStream(istream);
/** calculate number of items **/
int line_count = 0;
while( istream.available() > 0) // check if the file stream is at the end
{
(String)ois.readObject(); // read from the object stream,
// which wraps the file stream
line_count++;
}
Похоже, проблема связана с данными, которые вы выписали. Предполагая, что данные записаны в соответствии с этим кодом, не должно быть проблем.
(Я вижу, что вы читаете String
s. Это ObectInputStream
не для чтения текстовых файлов. InputStreamReader
и BufferedReader.readLine
. Аналогично, если вы написали файл с DataOutputSteam.writeUTF
, прочитайте его с помощью DataInputStream.readUTF
)
Нет. Поймать EOFException
и использовать это для завершения цикла.