На Java существует множество библиотек JSON.
Наиболее известными являются: Джексон, GSON, Genson, FastJson и org.json.
Обычно есть три вещи следует искать для выбора любой библиотеки:
В частности, для библиотек JSON (и любых сериализационных / десериализационных библиотек) также важна привязка данных, поскольку она устраняет необходимость написания кода котельной пластины для упаковки / распаковки данных.
Для 1 см. этот тест: https://github.com/fabienrenaud/java-json-benchmark Я использовал JMH , который сравнивает (jackson, gson, genson, fastjson, org.json, jsonp) производительность сериализаторов и десериализаторов с использованием API потоков и данных. Для 2 вы можете найти множество примеров в Интернете. Вышеупомянутый эталон также может быть использован в качестве источника примеров ...
Быстрое выведение теста: Джексон выполняет в 5-6 раз лучше, чем org.json, и более чем в два раза лучше, чем GSON.
Для вашего конкретного примера следующий код расшифровывает ваш json с помощью jackson:
public class MyObj {
private PageInfo pageInfo;
private List posts;
static final class PageInfo {
private String pageName;
private String pagePic;
}
static final class Post {
private String post_id;
@JsonProperty("actor_id");
private String actorId;
@JsonProperty("picOfPersonWhoPosted")
private String pictureOfPoster;
@JsonProperty("nameOfPersonWhoPosted")
private String nameOfPoster;
private String likesCount;
private List comments;
private String timeOfPost;
}
private static final ObjectMapper JACKSON = new ObjectMapper();
public static void main(String[] args) throws IOException {
MyObj o = JACKSON.readValue(args[0], MyObj.class); // assumes args[0] contains your json payload provided in your question.
}
}
Сообщите мне, если у вас есть какие-либо вопросы.
Оператор <<
на std::cout
перегружен. Его поведение зависит от типа правильного операнда. (Это фактически несколько разных функций, все названы operator<<
, компилятор решает, какой из них вызывать.)
Если вы дадите ему char*
или const char*
, он обрабатывает операнд как указатель на (первый символ) строки C-стиля и печатает содержимое этой строки:
const char * terry = "hello";
cout << terry; // prints "hello"
Если вы даете ему значение char
, оно печатает это значение как символ:
cout << *terry; // prints "h"
cout << terry[0]; // the same
Если вы указали ему указатель типа void*
, он печатает это значение указателя (в определенном порядке реализации, обычно шестнадцатеричном):
cout << static_cast<const void*>(terry); // prints something like 0x4008e4
Обработка char*
или const char*
как указатель на строку C-стиля - это особый случай, и единственное, что я могу придумать, которое вызывает operator<<
для печати чего-то другого, кроме значения операнда. Причина этого восходит к корням C ++ в C, который не имеет типа «string» и манипулирует строками с помощью указателей char*
.
Существует множество других перегрузок для operator<<
, для различных целочисленные и числовые типы с плавающей запятой, для std::string
и т. д.
Причиной этого является то, что std::cout
будет обрабатывать char *
как указатель на (первый символ) строки стиля C и печатать его как таковой. Если вы хотите использовать адрес , вы можете просто передать его указателю, который не был обработан таким образом, например:
cout << (void *) terry;
(или используйте бросок const void *
, если вы беспокоитесь о том, чтобы отбросить созвездие, что-то, что не является проблемой в данном конкретном случае).
Если вы скорее пурист, чем прагматик, вы также можете использовать C ++ static_cast
по строкам:
cout << static_cast <const void *> (terry);
, хотя в этом конкретном случае это необязательно, приведение к void *
будет работать нормально. Следующий пример кода показывает все эти параметры в действии:
#include <iostream>
int main (void) {
const char *terry = "hello";
std::cout << terry << '\n';
std::cout << (void *) terry << '\n';
std::cout << (const void *) terry << '\n';
std::cout << static_cast<const void *> (terry) << '\n';
return 0;
}
вывод (адрес может быть другим в вашей среде):
hello
0x8048870
0x8048870
0x8048870
Обратите внимание, что при использовании кнопки static_cast
, вы должны убедиться, что вы не пытаетесь отбросить константу с помощью static_cast <void *>
(это для const_cast
). Это одна из проверок, выполненных более новыми C ++-переходами, и старинный стиль не имеет этого ограничения.
cout перегружен, так что, когда вы даете ему char *, он будет печататься как указатель на строку стиля C. Таким образом, он печатает символы до тех пор, пока не ударит нулевой завершающий символ.
Если вы использовали printf вместо cout, вы увидите адрес. Вы также можете направить указатель на другой тип, скажем (void *), и вы также получите адрес.
Вы должны изменить свой код на это:
cout << static_cast<const void*>(terry);
Проблема в том, что оператор <<
перегружен для указателей на строки C-стиля для печати содержимого строки. Если вы вместо этого нарисуете его на необработанный указатель, вы будете иметь поведение по умолчанию для указателя печати, используя iostreams, как вы хотите.