【问题标题】:String array to object array with key-value pair inside the string字符串数组到对象数组,字符串内有键值对
【发布时间】:2022-01-12 05:57:41
【问题描述】:

我想从一个字符串数组构造一个带有键值对的对象数组。

字符串数组格式:

['<ISO Date> - <Log Level> - {"user_id: "<UUID>", "details": "<message event/action description>", "err": "<Optionall, error description>"}']

对象数组格式:

[{"timestamp": <Epoch Unix Timestamp>, "loglevel": "<loglevel>", "transactionId: "<UUID>", "err": "<Error message>" }]

stringArray = [
   "2021-08-09T02:12:51.259Z - error - {\"user_id\":\"1234-1111\",\"details\":\"Cannot find user orders list\",\"code\": 404,\"err\":\"Not found\"}",
   "2022-08-09T02:12:51.275Z - error - {\"user_id\":\"1111-1234\",\"details\":\"Cannot find user orders list\",\"code\":404,\"err\":\"Cannot find user orders list"}"
];

objectArray = [
   {
      "timestamp":1628475171259,
      "loglevel":"error",
      "userId":"1234-1111",
      "err":"Not found"
   },
   {
      "timestamp":1660011171275,
      "loglevel":"error",
      "userId":"1111-1234",
      "err":"Cannot find user orders list"
   }
];

【问题讨论】:

    标签: javascript arrays json object logparser


    【解决方案1】:

    你可以将每一行解构为"timestamp" - "logLevel" - "jsonStringified"

    后者可以JSON.parsed 检索对象

    请注意,也许您应该确保每一行都包含格式。否则你会有错误需要处理(如果没有jsonStringified,其他人输出了一些随机行,等等)

    stringArray = [
       "2021-08-09T02:12:51.259Z - error - {\"transactionId\":\"9abc55b2-807b-4361-9dbe-aa88b1b2e978\",\"details\":\"Cannot find user orders list\",\"code\": 404,\"err\":\"Not found\"}",
       "2022-08-09T02:12:51.275Z - error - {\"transactionId\":\"9abc55b2-807b-4361-9dbe-aa88b1b2e978\",\"details\":\"Cannot find user orders list\",\"code\":404,\"err\":\"Cannot find user orders list\"}"
    ];
    const tsCapture = '(.{'+"2022-08-09T02:12:51.275Z".length+'})'
    const levelCapture = '(error|warning|debug)'
    const stringCapture = '(.+)'
    const reg = new RegExp('^'+tsCapture + ' - ' + (levelCapture) + ' - ' + stringCapture+'$')
    
    const parsed = stringArray.map(line => {
      const [_, timestamp, logLevel, str] = line.match(reg)
      return {timestamp, logLevel, ...JSON.parse(str)}
    })
    
    console.log({ parsed })

    【讨论】:

    • 嘿伙计@grodzi,请你逐行解释你在这里做了什么?
    • 我想你明白我正在为给定的行迭代 stringArray 的每一行。然后我匹配每个有趣的部分(即时间戳、logLevel 和 JSON 可解析部分(命名为 str)。为了匹配这些部分,我编写了相关的 RegExp(tsCapture、levelCapture、stringCapture)。tsCapture 读取 n 个字符(其中 n 是数字ISOString 日期的字符数),levelCapture 捕获错误、警告或调试之一,然后 stringCapture 捕获行的“其余”部分
    【解决方案2】:

    在 Java 中,您可以通过使用标记进行拆分来做到这一点

    JSONArray jsonArray = new JSONArray();
            for(int i=0;i<stringArray.length; i++) {
                String string = stringArray[i];
                String[] stringSplit = string.split(" - ");
                JSONObject object = new JSONObject();
                object.put("timestamp", stringSplit[0]);
                object.put("loglevel", stringSplit[1]);
                String[] transtactionDetailSplit = stringSplit[2].split(":|,");
                object.put("transactionId", transtactionDetailSplit[1]);
                object.put("err", transtactionDetailSplit[7]);
                jsonArray.add(object);
            }
            System.out.println(jsonArray);
    

    请在需要的地方添加空检查

    【讨论】:

      猜你喜欢
      • 2022-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-27
      • 2021-08-08
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多