Извлечение определенного значения из файла JSON

Из файла JSON ниже я хочу извлечь X Time и Y Time. Как это сделать проще всего?

{
    "Timestamp": "Mon Mar 16 21:37:22 EDT 2015",
    "Event": "Reporting  Time",
    "Message": "load for http://xxx.xx.xx.xx:1xxxx/operations&proxy=www.mywebsite.co.nz&send=https://xxx.xx.xx.xx:xxxx took (X Time: 306 ms, Y Time: 1923 ms)StatusCode: Unknown<br>Cookies: nzh_weatherlocation=12; dax_ppv=11|NZH:home|NZH:home|NZH:home|9|undefined; Safari/537.36<br>CPUs: 2<br>Language: en-GB",

}

person liv2hak    schedule 18.03.2015    source источник
comment
Ваша строка json недействительна. Вы можете подтвердить это? jsonformatter.curiousconcept.com Кроме того, какой ключ/значение вы пытаетесь извлечь? Вы хотите сделать это в JavaScript?   -  person duyn9uyen    schedule 18.03.2015
comment
@ duyn9uyen, это правильный JSON, если не принимать во внимание \t и \r\n. И, учитывая, что в вопросе есть тег awk, я не думаю, что он работает с JS.   -  person RainingChain    schedule 18.03.2015


Ответы (3)


Вы можете использовать grep.

$ grep -o '[YX]\s*Time:\s*[^,)]*' file
X Time: 306 ms
Y Time: 1923 ms
  • [YX] будет соответствовать либо X, либо Y

  • \s* соответствует нулю или более пробелам.

  • Time:\s* Соответствует строке Time плюс следующие ноль или более пробелов.

  • [^,)]* Класс символов с отрицанием, который соответствует любому символу, кроме запятой или ), ноль или более раз.

person Avinash Raj    schedule 18.03.2015
comment
Не могли бы вы объяснить это регулярное выражение? - person liv2hak; 30.03.2015

Вот решение jq с использованием capture:

  .Message
| capture("X Time: (?<X Time>[^,]+), Y Time: (?<Y Time>[^)]+)")

Если этот фильтр находится в filter.jq, а входные данные находятся в input.json

jq -M -f filter.jq input.json

будет производить

{
  "X Time": "306 ms",
  "Y Time": "1923 ms"
}
person jq170727    schedule 24.08.2017

Прежде всего, я рекомендую вашим библиотекам Gson или Jackson (используются для сериализации/десериализации) json-объектов проще.

Но если бы я был вами, я бы сделал это вручную следующим образом:

JsonObject MyJson = новый JsonObject (ваша строка);

1.- Чтобы получить время X или время Y:

String FullMessage=MyJson.getString("message");

int XPosition=FullMessage.indexOf("X Time:");
int YPosition=FullMessage.indexOf("Y Time:");
int EndYPosition=FullMessage.indexOf("ms)");

String XTime=FullMessage.substring(XPosition,Yposition);
String YTime=FullMessage.subString(Yposition,EndYPosition);

/* Таким образом, вы можете получить данные x и y, я не проверял это, но основную идею я пишу. */

2. И написать URL-адрес легко, просто сделайте это:

MyObject.putString("url","www.mywebsite.co.nz"); //and thats all

Но я рекомендую использовать и библиотеку Serializer/deserializer, это проще и лучше.

С Уважением.

person Max Pinto    schedule 18.03.2015