【问题标题】:Parse non JSON to JSON将非 JSON 解析为 JSON
【发布时间】:2021-08-10 19:51:03
【问题描述】:

我有一个文件,其中包含我需要解析并存储在数据库中的数据。下面是文件中 2 个条目的示例。我不太确定结构是什么(尽管它看起来是 ndJSON)。我正在尝试将数据解析为 JSON 对象,以便将其存储在数据库中,但似乎无法弄清楚。这是我到目前为止所拥有的

var ndjson = {
        "sequence-num": "0123456789",
        "version": "N1.4",
        "record-type": "R",
        "session-id": "197-30760303",
        "date": "2021-07-23 15:00:53",
        "passport-header": { "alg": "ES256", "ppt": "test", "typ": "passport", "x5u": "https://cr.com" },
        "passport-payload": { "attest": "A", "dest": { "tn": ["0123456789"] }, "iat": 0123456789, "orig": { "tn": "0123456789" }, "origid": "c699f78a-ebc6-11eb-bfd8-bec0bbc98888" },
        "identity-header": "eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci5zYW5zYXkuY29tL1RvdWNodG9uZV82ODNBIn0.eyJhdHRlc3QiOiJCIiwiZGVzdCI6eyJ0biI6WyIxMjUeyJhdHRlc3QiOiJCIiwiZGVzdCI6eyJ0biI6WyIxMj;info=<https://google.com/>;alg=ES256;ppt=\"test\""
    }
    {
        "sequence-num": "0123456788",
        "version": "N1.4",
        "record-type": "R",
        "session-id": "214-30760304",
        "date": "2021-07-23 15:00:53",
        "passport-header": { "alg": "ES256", "ppt": "test", "typ": "passport", "x5u": "https://cr.com" },
        "passport-payload": { "attest": "B", "dest": { "tn": ["0123456788"] }, "iat": 0123456788, "orig": { "tn": "0123456788" }, "origid": "c69d0588-ebc6-11eb-bfd8-bec0bbc98888" },
        "identity-header": "eyJhbGciOiJFUzI1NiIsInBwdCI6InNoYWtlbiIsInR5cCI6InBhc3Nwb3J0IiwieDV1IjoiaHR0cHM6Ly9jci5zYW5zYXkuY29tL1RvdWNodG9uZV82ODNBIn0.eyJhdHRlc3QiOiJCIiwiZGVzdCI6eyJ0biI6WyIxMjUeyJhdHRlc3QiOiJCIiwiZGVzdCI6eyJ0biI6WyIxMj;info=<https://google.com/>;alg=ES256;ppt=\"test\""
    };
 

    let result = ndjson.split(',').map(s => JSON.parse(s));
    console.log('The resulting array of items:');
    console.log(result); 

    console.log('Each item at a time:');

    for (o of result) {

        console.log("item:", o);

    }

当我运行它时,我在"sequence-num": "0123456788", 的第二个节点的第 12 行收到 Uncaught SyntaxError: Unexpected token ':' 错误。

感谢您的帮助,谢谢!

【问题讨论】:

  • ndjson 应该是一个数组吗?如果是这样,则您缺少[] 以及中间的,
  • 实际文件是否包含有效的 JSON?因为那是彼此后面的两个对象,中间没有逗号,也没有方括号包围它们。在这一点上,这只是一个 JavaScript 语法错误。 如果实际的ndjson 是一个有效的数组,则无需拆分或解析任何内容:jsfiddle.net/bo2h1684
  • 在数据库中存储对象可以通过使用 noSQL 数据库或将对象转换为字符串并将其存储在文本列中来完成(使用 JSON.stringify(some_obj)
  • @crashmstr 我不确定 ndjson 是否应该有括号。这是发送给我的数据,我需要通过在每个对象之间添加逗号并在整个对象周围添加括号来将其解析为 JSON 格式。
  • @ChrisG 这是在文件中发送给我的确切数据。我认为它不是有效的 JSON。

标签: javascript parsing


【解决方案1】:

如果您确实有 ndJSON(newline-delimited JSON),那么文件中的每一行都是有效的 JSON,由换行符分隔。一个简单的文件如下所示:

{"key1": "Value 1","key2": "Value 2","key3": "Value 3","key4": "Value 4"}
{"key1": "Value 5","key2": "Value 6","key3": "Value 7","key4": "Value 8"}

这与您在此处发布的格式化数据不同,并且差异很重要,因为一旦您将其格式化,有效的 JSON 对象就不能简单地通过换行符的存在来区分。

因此,假设您确实有有效的 ndJSON,在其原始形式中,您可以通过在 newLines 上使用 split() 并在结果数组上使用 JSON.parse() 来提取它。

这个 sn-p 添加了一些文件处理以允许上传文件,但此后它使用 split()JSON.parse() 来提取数据:

"use strict";
    document.getElementsByTagName('form')[0].addEventListener('submit',function(e){
        e.preventDefault();
        const selectedFile = document.getElementById('inputFile').files[0];
        let fr = new FileReader();
        fr.onload = function(e){
            let ndJSON = e.target.result;  // ndJSON extracted here
            let ndJSONLines = ndJSON.split('\n');
            // Process JSON objects here
            ndJSONLines.forEach(function(el){
                let obj = JSON.parse(el);
                Object.keys(obj).forEach(key=>{
                   console.log(`Key: ${key}, Value: ${obj[key]}`);
                });
            });
        }
        fr.readAsText(selectedFile)
    });
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Parsing ndJSON</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
    <input type="file" name="inputFile" id="inputFile">
    <input type="submit">

</form>
</body>
</html>

输出,基于上面的示例文件:

【讨论】:

  • 如果 ndJson 在每一行都有一个新条目,那么数据结构不是 ndJson。它在 OP 中的样子,正是它在文件中的样子。
  • @Rodney 我又看了一遍。添加前导和尾随括号并在对象之间插入逗号以获得​​(几乎有效的)JSON 数组很容易。即使您这样做,此元素 "iat": 0123456789 也不会验证。该值应该是字符串,或者丢失前导 0。一个正则表达式可能会解决这个问题,但是您正在使用的文件显然已经损坏,并且不知道还会出现什么。回到提供它的人那里,让他们修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 2012-01-29
  • 1970-01-01
  • 2015-11-23
  • 2021-12-26
  • 2011-10-08
  • 2015-03-01
相关资源
最近更新 更多