C указатели и строка [дубликат]

На Java существует множество библиотек JSON.

Наиболее известными являются: Джексон, GSON, Genson, FastJson и org.json.

Обычно есть три вещи следует искать для выбора любой библиотеки:

  1. Производительность
  2. Простота использования (код прост для записи и разборчивости) - это касается функций.
  3. Для мобильных приложений: зависимость / размер jar

В частности, для библиотек 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.
    }
}

Сообщите мне, если у вас есть какие-либо вопросы.

41
задан Garrett 8 July 2014 в 05:19
поделиться

5 ответов

-1
ответ дан Ivan Smirnov 1 September 2018 в 02:56
поделиться

Оператор << на 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 и т. д.

14
ответ дан Keith Thompson 1 September 2018 в 02:56
поделиться

Причиной этого является то, что 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 ++-переходами, и старинный стиль не имеет этого ограничения.

58
ответ дан paxdiablo 1 September 2018 в 02:56
поделиться

cout перегружен, так что, когда вы даете ему char *, он будет печататься как указатель на строку стиля C. Таким образом, он печатает символы до тех пор, пока не ударит нулевой завершающий символ.

Если вы использовали printf вместо cout, вы увидите адрес. Вы также можете направить указатель на другой тип, скажем (void *), и вы также получите адрес.

1
ответ дан Richard Fung 1 September 2018 в 02:56
поделиться

Вы должны изменить свой код на это:

cout << static_cast<const void*>(terry);

Проблема в том, что оператор << перегружен для указателей на строки C-стиля для печати содержимого строки. Если вы вместо этого нарисуете его на необработанный указатель, вы будете иметь поведение по умолчанию для указателя печати, используя iostreams, как вы хотите.

8
ответ дан sasha.sochka 1 September 2018 в 02:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: