【问题标题】:Split new-line JSON into one array将换行 JSON 拆分为一个数组
【发布时间】:2022-01-14 11:57:20
【问题描述】:

我有一个来自 Web 服务器的 JSON,如下所示:

{"timestamp":1642069251.6908009,"station_id":"ORBB","channel":5,"freq":131.725,"level":-28.1,"error":0,"mode":"2","label":"Q0","block_id":"8","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S10A"}
{"timestamp":1642069257.00876,"station_id":"ORBB","channel":5,"freq":131.725,"level":-41.3,"error":0,"mode":"2","label":"Q0","block_id":"7","ack":false,"tail":"PH-HXO","flight":"HV6905","msgno":"S28A"}
{"timestamp":1642069259.057013,"station_id":"ORBB","channel":5,"freq":131.725,"level":-24.9,"error":0,"mode":"D","label":"Q0","block_id":"9","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S11A"}

l have followed this answer 但我在控制台中没有可显示的内容。

我无法编辑上面的数据 JSON 以提供有效的 JSON,因为它来自使用 Ajax 的数据服务器。

   $(document).ready(() => {
         $.ajax('acarsdec.json', {
        type: 'GET',
        //dataType: "text",
        timeout: 10000,
        cache: false,
        
}).done(function (data, textStatus, jqXHR) {
const dataasfile = `data:text/plain;base64,${btoa(data)}`;

fetch(dataasfile).then(res => res.text()).then(text => {
  let jsonstr = `[${text.split('\n').join(',')}]`;
  let json = JSON.parse(jsonstr);
  console.log(json);
});
    })

    })

【问题讨论】:

  • 您需要删除 dataType: "json" - 它告诉 jQuery 自动将响应解析为 JSON,但是当它是 not 有效的 JSON 时当然会失败。
  • (对于\n的分割,你应该确保没有一个可以包含这种换行符。否则,这将失败或导致错误的数据.)
  • 来自服务器的 JSON 无效。考虑从源头上修复它?
  • 是的,它不是 JSON,因此不应使用 dataType: "json"。也许删除它会使 jQuery 猜测错误,必须明确设置为 "text"
  • 那么您正在格式化的数据似乎还有其他问题。正如@evolutionxbox 建议的那样,这通常最容易从源头修复,因此它会生成有效的 JSON。生成随机数据并尝试在接收端将格式转换为 JSON 通常注定要失败。有很多潜在的问题。作为猜测,您可能在末尾有一个额外的换行符,因此生成的字符串类似于 [1, 2, 3, ] 这将是无效的。

标签: javascript json


【解决方案1】:

作为起点,您展示的这段代码不是有效的 JSON,因此没有理由尝试将其解析为 JSON。

如果您可以相信源是每行一个对象的“伪”JSON,您可以在换行符 (\n) 上拆分文本,然后用逗号 (,) 再次连接字符串,然后将方括号括在字符串:

let jsonstr = `[${text.split('\n').join(',')}]`;

这里我使用 fetch 函数和一个数据 URL 来模拟 AJAX 请求。

/***** start setup for demostration *****/

const data = `{"timestamp":1642069251.6908009,"station_id":"ORBB","channel":5,"freq":131.725,"level":-28.1,"error":0,"mode":"2","label":"Q0","block_id":"8","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S10A"}
{"timestamp":1642069257.00876,"station_id":"ORBB","channel":5,"freq":131.725,"level":-41.3,"error":0,"mode":"2","label":"Q0","block_id":"7","ack":false,"tail":"PH-HXO","flight":"HV6905","msgno":"S28A"}
{"timestamp":1642069259.057013,"station_id":"ORBB","channel":5,"freq":131.725,"level":-24.9,"error":0,"mode":"D","label":"Q0","block_id":"9","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S11A"}`;

const dataasfile = `data:text/plain;base64,${btoa(data)}`;

/***** end setup for demostration *****/

/* replace dataasfile with your URL to the API */
fetch(dataasfile).then(res => res.text()).then(text => {
  let jsonstr = `[${text.split('\n').join(',')}]`;
  let json = JSON.parse(jsonstr);
  console.log(json);
});

更新

OP 仍然无法从请求中解析字符串。显然字符串末尾还有一个空行。在以下示例中,我在字符串末尾添加了一个空行。然后我过滤数组,只接受数组中不是空字符串的项目。这一行:

let jsonstr = `[${text.split('\n').filter(str => str != '').join(',')}]`;

/***** start setup for demostration *****/

const data = `{"timestamp":1642069251.6908009,"station_id":"ORBB","channel":5,"freq":131.725,"level":-28.1,"error":0,"mode":"2","label":"Q0","block_id":"8","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S10A"}
{"timestamp":1642069257.00876,"station_id":"ORBB","channel":5,"freq":131.725,"level":-41.3,"error":0,"mode":"2","label":"Q0","block_id":"7","ack":false,"tail":"PH-HXO","flight":"HV6905","msgno":"S28A"}
{"timestamp":1642069259.057013,"station_id":"ORBB","channel":5,"freq":131.725,"level":-24.9,"error":0,"mode":"D","label":"Q0","block_id":"9","ack":false,"tail":"A6-ANR","flight":"G90369","msgno":"S11A"}
`; // blank line here in the end on purpose!

const dataasfile = `data:text/plain;base64,${btoa(data)}`;

/***** end setup for demostration *****/

/* replace dataasfile with your URL to the API */
fetch(dataasfile).then(res => res.text()).then(text => {
  let jsonstr = `[${text.split('\n').filter(str => str != '').join(',')}]`;
  let json = JSON.parse(jsonstr);
  console.log(json);
});

【讨论】:

  • 感谢您的回答。我就是这样使用的,但我仍然注意到从 URL 中显示。我更新了我上面的问题代码。
  • @AliGhassan 我的大部分示例仅用于演示/示例。要么取整个 fetch-part 并将 dataasfile 替换为真实的 URL,要么取行 let jsonstr = [${text.split('\n').join(',')}]; 并实现它在您的 jquery 回调函数中。
  • 当我使用此代码let jsonstr = [${text.split('\n').join(',')}] 时,他会将其更改为有效的 json 。但他会把'放在最后,所以我需要删除它才能获得有效的json。 [ {} ,]
  • 检查json这里jsoneditoronline.org/beta/…看到json的结尾},]
  • @AliGhassan 我认为我在那个链接中看到的和你看到的不一样。左边有一个有效的 JSON 文档,右边没有。从你的两个cmets,我的猜测是伪JSON文档末尾有一个空行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多