Quiero construir una matriz de objetos con un par clave-valor de una matriz de cadenas.
el formato de matriz de cadenas:
['<ISO Date> - <Log Level> - {"user_id: "<UUID>", "details": "<message event/action description>", "err": "<Optionall, error description>"}']
el formato de matriz de objetos:
[{"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" } ];Puede deconstruir cada línea como "timestamp" - "logLevel" - "jsonStringified"
El último puede ser JSON.parse d para recuperar el objeto
Tenga en cuenta que tal vez debería asegurarse de que cada línea tenga el formato. De lo contrario, tendría que manejar errores (qué pasa si no hay jsonStringified, qué es si alguien más generó algunas líneas aleatorias, etc.)
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 })En Java, puede hacer esto dividiendo usando tokens
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);Agregue amablemente un cheque nulo donde sea necesario