【问题标题】:Remove data from string property in a json从 json 中的字符串属性中删除数据
【发布时间】:2022-01-04 10:32:27
【问题描述】:

给定以下日志对象:

{
  "message": "login: error {\"error\":{\"message\":\"Network Error\",\"name\":\"Error\",\"stack\":\"Error: Network Error\\n    at something (somewhere)\\n    at something (somewhere)\",\"config\":{\"url\":\"/a/place\",\"method\":\"get\",\"headers\":{\"Accept\":\"application/json, text/plain, */*\",\"Authorization\":\"bla blablabla\",\"X-Amzn-Trace-Id\":\"yadiyadiyadi\"},\"baseURL\":\"verygoodplace"}}}",
  "level": "warning",
  "sessionId": "blablabla"
}

如何完全删除message.headers.Authorization 条目? 由于它出现在字符串中,因此我不能(直接)使用未设置的 lodash,并且我需要以某种方式更改字符串。

【问题讨论】:

  • 你使用什么语言?
  • @Serge javascript
  • 我建议稍微调整一下message 字符串,直到它可以用JSON.parse() 解析。然后您将获得一个易于操作的 JS 对象。然后您可以使用 JSON.stringify() 将其转换回与您开始时类似的字符串。可能看起来有很多步骤,但直接进行这种字符串操作在你知道的地方是更大的痛苦。
  • @PeterB 我应该调整什么以便解析它?我应该取消它吗?
  • 在下面查看我的答案。

标签: javascript json


【解决方案1】:

我建议稍微清理一下message,以便可以使用JSON.parse() 对其进行解析。似乎只需要在第一个 { 之前丢弃文本。

解析将创建一个易于操作的 JS 对象,之后您可以使用JSON.stringify() 将其转换回与您开始时类似的字符串。

这可能看起来有很多步骤,但直接进行这种字符串操作可能会更加痛苦。

工作演示:

const logObj = {
  "message": "login: error {\"error\":{\"message\":\"Network Error\",\"name\":\"Error\",\"stack\":\"Error: Network Error\\n    at something (somewhere)\\n    at something (somewhere)\",\"config\":{\"url\":\"/a/place\",\"method\":\"get\",\"headers\":{\"Accept\":\"application/json, text/plain, */*\",\"Authorization\":\"bla blablabla\",\"X-Amzn-Trace-Id\":\"yadiyadiyadi\"},\"baseURL\":\"verygoodplace\"}}}",
  "level": "warning",
  "sessionId": "blablabla"
}

const index = logObj.message.indexOf("{");
const jsonText = logObj.message.substring(index);
const parsed = JSON.parse(jsonText);

delete parsed.error.config.headers.Authorization;   // remove unwanted node

console.log("The cleaned message:");
console.log(JSON.stringify(parsed, undefined, 2));  // print with indentation

const prefix = logObj.message.substring(0, index);
logObj.message = prefix + JSON.stringify(parsed);

console.log("The updated logObj:");
console.log(JSON.stringify(logObj, undefined, 2));  // print with indentation

注意 - 为了完成这项工作,我必须将 verygoodplace" 更改为 verygoodplace\",看起来您在准备用于问题的 log object 时出错了。

【讨论】:

  • 哇!非常感谢你!这正是我一直在寻找的!我在使用 message 运行此程序时遇到问题,在位置 779 处出现 Uncaught SyntaxError: Unexpected number in JSON。但我在该位置没有看到任何数字,所以我不确定那里出了什么问题。跨度>
  • 在那条消息中,消息字符串的末尾似乎有垃圾:- C ID: 124asf-12412rasf-12412qsf-124asfasf_430。如果您想继续使用JSON.parse 方法,您必须以类似的方式将其删除。尝试使用 const index2 = jsonText.lastIndexOf("}") 后跟 const jsonText2 = jsonText.subString(0, index2) 或类似的东西(可能必须使用 index2 + 或 - 1),然后从中创建 parsed
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2021-11-01
  • 2019-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-08
  • 1970-01-01
相关资源
最近更新 更多