Java JSON -Джексон- Вложенные элементы - PullRequest
6 голосов
/ 05 декабря 2011

Моя строка JSON имеет вложенные значения.

Что-то вроде

"[{"listed_count":1720,"status":{"retweet_count":78}}]"

Я хочу значение retweet_count.

Я использую Джексона.

Приведенный ниже код выводит «{retweet_count=78}», а не 78. Мне интересно, могу ли я получить вложенные значения, как PHP это делает, т.е. status->retweet_count. Спасибо.

import java.io.IOException;
import java.util.List;
import java.util.Map;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.type.TypeReference;

public class tests {
public static void main(String [] args) throws IOException{
    ObjectMapper mapper = new ObjectMapper();
  List <Map<String, Object>> fwers = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", new TypeReference<List <Map<String, Object>>>() {});
    System.out.println(fwers.get(0).get("status"));

    }
}

Ответы [ 3 ]

12 голосов
/ 05 декабря 2011

Если вы знаете базовую структуру данных, которые вы извлекаете, имеет смысл представить их правильно.Вы получаете все виды тонкостей, таких как безопасность типов;)

public static class TweetThingy {
    public int listed_count;
    public Status status;

    public static class Status {
        public int retweet_count;
    }
}

List<TweetThingy> tt = mapper.readValue(..., new TypeReference<List<TweetThingy>>() {});
System.out.println(tt.get(0).status.retweet_count);
9 голосов
/ 05 декабря 2011

Попробуйте что-нибудь подобное. Если вы используете JsonNode, ваша жизнь станет проще.

JsonNode node = mapper.readValue("[{\"listed_count\":1720,\"status\":{\"retweet_count\":78}}]]", JsonNode.class);

System.out.println(node.findValues("retweet_count").get(0).asInt());
2 голосов
/ 05 декабря 2011

Вы, вероятно, можете сделать System.out.println(fwers.get(0).get("status").get("retweet_count"));

Редактировать 1:

Изменение

List <Map<String, Object>> fwers = mapper.readValue(..., new TypeReference<List <Map<String, Object>>>() {});

до

List<Map<String, Map<String, Object>>> fwers = mapper.readValue(..., new TypeReference<List<Map<String, Map<String, Object>>>>() {});

А потом сделай System.out.println(fwers.get(0).get("status").get("retweet_count"));

У вас нет Карты пар, у вас есть Карта <String, Map<String, Object>> пар.

Редактировать 2:

Хорошо, я понял. Итак, у вас есть список карт. И на первой карте в списке у вас есть пара kv, где значением является целое число, и другая пара kv, где значением является другая карта. Когда вы говорите, что у вас есть список карт, он жалуется, потому что пара kv со значением int не является картой (это просто int). Таким образом, вы должны либо сделать все свои карты пар kv (измените это int на карту), а затем использовать мои правки выше. Или вы можете использовать свой оригинальный код, но приведите объект к карте, когда вы знаете, что это карта.

Так попробуйте это:

Map m = (Map) fwers.get(0).get("status");
System.out.println(m.get("retweet_count"));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...