Извлечь значение с помощью пути JSON из массива

У меня есть Json, как показано ниже

{"pd":"{\"e\":{\"h\":{\"ak\":\"120\",\"at\":\"app\"},\"b\":[{\"ts\":1319549658547,\"tz\":-400,\"s\":\"StartUpScreen\",\"et\":8,\"ev\":\"sessionStart\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{\"day\":\"Tuesday\"}},{\"ts\":132,\"tz\":-400,\"s\":\"StartUpScreen\",\"et\":3,\"ev\":\"AutomaticFeedRefresh\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{}},{\"ts\":131,\"tz\":-400,\"s\":\"MainScreen\",\"et\":3,\"ev\":\"MainScreen Event\",\"si\":\"19477682-de55-414f-82c9-19bec331dc33\",\"tt\":{}}],\"tt\":{\"OSV\":\"7.10\"}}}","serverPayload":{"httpHeaders":{"x-bluecoat-via":["35D3468EFF4D5F18"],"content-type":["application\/x-www-form-urlencoded"]},"senderIp":["101.100.000.100"]}}

Мне просто нужны значения ak, b [ts,si and tt[day]] и senderIp. Теперь у меня есть 2 вопроса: как мне извлечь все атрибуты ts в b и senderIp. Я использовал приведенный ниже код для ak, ts и si. Я не уверен, как я получаю "tt", также, когда я запускаю этот код, я получаю исключение, как показано ниже

    String pd = JsonPath.read(jsonString, "$.pd");
    String ak = JsonPath.read(pd, "$e.h.ak");
    String ak = JsonPath.read(pd, "$e.h.b[0]");
//    String b = JsonPath.read(pd,"$.e.b[0][0]");
//    String b = JsonPath.read(pd,"$.e.b[0][5]");
    System.out.println("value of ak: "+ak);

Исключение в потоке "main" java.lang.ClassCastException: net.minidev.json.JSONObject cannot be cast to java.lang.String.


person user1677986    schedule 17.09.2012    source источник


Ответы (1)


$.e.h.b[0] выглядит как объект JavaScript (с полями, включающими «ts» и «tz»), а не как строку. Поэтому для вашего парсера JSON разумно рассматривать его как JSONObject, а не как строку. Возможно, вам нужно перейти к $.e.h.b[0].ts или другому полю, которое вас интересует. Примерно так:

long ts = JsonPath.read(pd, "$e.h.b[0].ts");

Я предполагаю, что это ваша вторая String ak = строка, которая вызывает исключение. Мне сложно понять другой ваш вопрос об атрибутах "ts". Может быть, вы могли бы отформатировать строку JSON для облегчения чтения?

person Hew Wolff    schedule 17.09.2012
comment
Исключение в основном потоке java.lang.ClassCastException: java.lang.Long не может быть преобразован в java.lang.String - person user1677986; 18.09.2012
comment
@ Hew Wolff Чтобы упростить задачу, я хочу извлечь значения ts, si, tt и senderIp. - person user1677986; 18.09.2012
comment
ts - это целое число в JSON, верно? Поэтому вы должны попытаться получить его как целочисленный тип. Если бы вы пытались получить его как строку, это объяснило бы исключение. Я отредактировал свой ответ, чтобы подробнее рассказать об этом. - person Hew Wolff; 18.09.2012
comment
спасибо за вашу помощь, у меня есть ответ ... чтобы получить ts, я должен перейти к объекту с массивом вроде b [0] .ts и преобразовать значение в строку или использовать метод tostring () - person user1677986; 19.09.2012
comment
Превосходно. Если вы согласны принять мой ответ, щелкнув галочку, это вызовет у меня теплые чувства. :-) - person Hew Wolff; 19.09.2012
comment
у меня аналогичная проблема, не могли бы вы мне помочь: stackoverflow.com/questions/35251927/ - person emoleumassi; 07.02.2016