簡體   English   中英

JavaScript-從日志文件提取JSON

[英]JavaScript - Extract JSON from log file

我需要從日志文件中提取JSON字符串(稍后將用於解析JSON)。 該文件的格式如下:

[16:11:20] some text
[16:11:20] some text
some text
some text
[
  {
    "description": "some text",
    "elements": [{
        "id": "some text",
        "keyword": "some text",
        "line": 20,
        "name": "some text",
        "steps": [{
            "arguments": [],
            "keyword": "some text ",
            "result": {
                "status": "passed",
                "duration": 14884761888
            },
            "hidden": true,
            "match": {
                "location": "some text"
            }
        },
        {
            "arguments": [],
            "keyword": "sometext ",
            "name": "sometext",
            "result": {
                "status": "passed",
                "duration": 463674
            },
            "line": 11,
            "match": {
                "location": "sometext"
            }
        }
        ],
        "tags": [
          {
            "name": "@sometext-no",
            "line": 7
          },
          {
            "name": "@sometext",
            "line": 8
          }
        ],
        "type": "sometext"
      }

    ],
    "id": "sometext",
    "keyword": "sometext",
    "line": 1,
    "name": "sometext",
    "tags": [],
    "uri": "sometext"
  }
][16:11:54] some text
[16:11:54] some text

如何在JavaScript中構造一個正則表達式,該正則表達式將從此文件中提取JSON數據,以便string.match()可以使用它來提供所需的輸出

我正在嘗試的模式如下

var regExtract = /(\[\s+\{[\s\S]*\}\s+\]\s+\}\s+\]\s+\}\s+\])/;
var matchedJson = data.toString().match(regExtract)[1];

我更新了答案,您可以嘗試執行以下操作:

var str = `[16:11:20] some text
[16:11:20] some text
some text
some text
[
  {
    "description": "some text",
    "elements": [{
        "id": "some text",
        "keyword": "some text",
        "line": 20,
        "name": "some text",
        "steps": [{
            "arguments": [],
            "keyword": "some text ",
            "result": {
                "status": "passed",
                "duration": 14884761888
            },
            "hidden": true,
            "match": {
                "location": "some text"
            }
        },
        {
            "arguments": [],
            "keyword": "sometext ",
            "name": "sometext",
            "result": {
                "status": "passed",
                "duration": 463674
            },
            "line": 11,
            "match": {
                "location": "sometext"
            }
        }
        ],
        "tags": [
          {
            "name": "@sometext-no",
            "line": 7
          },
          {
            "name": "@sometext",
            "line": 8
          }
        ],
        "type": "sometext"
      }

    ],
    "id": "sometext",
    "keyword": "sometext",
    "line": 1,
    "name": "sometext",
    "tags": [],
    "uri": "sometext"
  }
][16:11:54] some text
[16:11:54] some text
`;

var json = '';
var jsonArray = [];
var implode = false;
str.split('\n').forEach(function(v, k){   
  if(v === '  {'){
    console.log(k, v);
    implode = true;
  }

  if(implode){
    json = json + v + '\n';
  }

  if(v === '  }'){      
    console.log(k, v);
    implode = false;
    jsonArray.push(json.trim());
    json = '';

    console.log(jsonArray);    
  }
});
console.log(JSON.parse(jsonArray[0]));

小提琴: https : //jsfiddle.net/x0cc25q4/7/

更新:帶有正則表達式的簡短版本:

var arr = str.split('\n').join('').match(/\[\s{2}(\{.*?\})\]/g);
console.log(JSON.parse(arr[0]));

小提琴: https : //jsfiddle.net/x0cc25q4/8/

不確定僅在需要計算左括號和右括號時,才可以將它用於regexp。 嘗試

var start=string.indexOf('[{');
var level=1;
start++;
while (level>0){
   if (string[start]==='[') level++;
   if (string[start]===']') level--;
   start++;
}

如果json的字符串中可能有'['或']',這肯定會變得更加復雜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM