分析不带逗号分隔符的 JSON 数据
parsing json data without a comma separator
我的JSON如下所示
{"_id":707860,"name":"Hurzuf","country":"UA","coord":{"lon":34.283333,"lat":44.549999}}
{"_id":519188,"name":"Novinki","country":"RU","coord":{"lon":37.666668,"lat":55.683334}}
{"_id":1283378,"name":"Gorkhā","country":"NP","coord":{"lon":84.633331,"lat":28}}
{"_id":1270260,"name":"State of Haryāna","country":"IN","coord":{"lon":76,"lat":29}}
{"_id":708546,"name":"Holubynka","country":"UA","coord":{"lon":33.900002,"lat":44.599998}}
这是一个没有逗号分隔的JSON,如何读取这个文件?我试图解析 JSON 并在两者之间添加逗号,但也无法做到这一点。
myapp.controller('Ctrl', ['$scope', '$http', function($scope, $http) {
$http.get('todos.json').success(function(data) {
var nuarr = data.toString().split("'n");
for(i in nuarr) {
myjson.push(i+",");
}
});
}]);
这种格式通常称为"换行符分隔的 JSON"或"ndjson";有几个模块可以解析它,但是如果你的数据集很小,你可以一次完成所有工作,那么你就走在了正确的轨道上:
var ndjson = "..." // assuming your data is already loaded in as a string
var records = ndjson.split(''n').map(function (record) {
return JSON.parse(record)
})
这稍微简化了它,但是您将所有记录都作为解析的JSON对象放在一个数组中。之后你对它们做什么取决于你,但这里的关键要点是你的JSON是一个对象列表,而不是单个对象:你不想把它作为一个整体来解析,而是作为一个单独的记录来解析。
假设你想创建一个对象,其键是单个 ID;这可能会有所帮助:
var recordHash = {}
records.forEach(function (record) {
recordHash[record._id] = record
})
现在,您可以recordHash['12345678']
假设12345678
是所需记录的 ID,则可以将各个记录寻址为。您需要将记录更改为对您的应用程序有意义的任何数据结构,因此这实际上取决于您要查找的内容,但该示例可能会让您入门。
我真的不建议在解析之前尝试将您收到的数据转换为其他格式;它很脆弱。您会发现,以提供数据的方式解析数据,然后将其转换为对应用程序有意义的任何数据结构,这更安全且更可重用。
>$http.get
期望响应必须是 json。您可以编写自己的自定义响应转换器来执行此操作。
$http({
url: 'todos.json',
method: 'GET',
transformResponse: function (data) {
return data.split(''n').map(function(line) {
return JSON.parse(line);
});
}
}).success(function (response) {
console.log(response);
// do whatever you want to do
// response will be of type array of objects
});
JSON 必须是单个对象或数组。仅使用逗号将一堆对象连接在一起并不能定义单个 JSON 对象。尝试这样做来获取可解析的对象数组:
var nuarr = data.toString().split("'n");
myjson = '[' + nuarr.join(',') + ']';
然后JSON.parse(myjson)
应该返回一个对象数组。或者,您可以将nuarr
的每个元素映射到其 JSON 解析的值,并在另一个数组中收集结果。
var myJson = nuarr.join(',');
但你到底想做什么?您的代码正在将带有逗号的字符串推送到数组中,因此以
["{...},", "{...},", ...]
在我看来,您有一个 json 对象的集合,分隔符作为换行符。
试试这个:
myapp.controller('Ctrl', ['$scope', '$http', function($scope, $http) {
$http.get('todos.json').success(function(data) {
myjson = data.split("'n").map(function(line) { return JSON.parse(line); });
});
}]);
使用正则表达式拆分为行,然后将每行映射到其 JSON 解析的等效项,从而在每行上生成一个对象数组:
input . match(/^.*$/gm) . map(JSON.parse)
或者按照其他答案的建议使用split
:
input . split(''n') . map(JSON.parse)
$http.get 期望响应必须是 json。您可以编写自己的自定义响应转换器来执行此操作。
$http({
url: 'todos.json',
method: 'GET',
transformResponse: function (data) {
return data.split(''n').map(function(line) {
return JSON.parse(line);
});
}
}).success(function (response) {
console.log(response);
// do whatever you want to do
// response will be of type array of objects
});
尽管看起来很愚蠢,但我们厌倦了在 JSON 中使用逗号和引号,以及没有注释或多行字符串。
知道 Douglas Crockford 和他的门徒会喊"亵渎神明",我们继续为我们自己的 Relax Json 语法编写规范、解析器和格式化程序。
事实是你真的不需要逗号,只有在少数特殊情况下才需要引号。 而且您也不需要换行符。
使用 Relax Json,为了使您的示例正常工作,您只需在已有的内容周围加上"["和"]"并调用
val realJson = parser.stringToJson(...)
-
但是数组值之间不需要换行符。
-
您还可以删除键值对之间的所有逗号。
-
而且您的钥匙不需要引号。
所以你可以这样做:
[
{ _id:707860 name:Hurzuf country:UA
coord:{lon:34.283333 lat:44.549999}
}
{ _id:519188 name:Novinki country:RU
coord:{lon:37.666668 lat:55.683334}
}
]
链接到规格:http://www.relaxedjson.org
链接到国家防范机制https://www.npmjs.com/package/really-relaxed-json
将示例粘贴到此处,看看解析起来有多容易:http://www.relaxedjson.org/docs/converter.html
> 2022 年更新
@milkandtang答案让我走上了正确的道路,但JSON.parse()
给我带来了麻烦,即使在拆分线路后也返回了错误。它不断抱怨行为空或格式不正确。
这就是对我有用的换行符分隔的 JSON
var ndjson = data;//must be a string
//declare variable that will be array of json
var json = [];
//split
ndjson.split(''n').map(function (record) {
//regex to format each array to a json object
var array = JSON.parse(`[${record.replace(/'}'n'{/g, '},{')}]`);
//push to json array
json.push(array);
})
//pheeew...
console.log(json);
- jQuery匹配JSON对象的部分文本
- 在循环中分配json值时,值被覆盖
- 需要帮助设置json数组
- 如何在Javascript中将JSon对象转换为数组
- 我可以在json对象中添加一个函数吗
- 使用JS将数组转换为json对象
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用JQuery解析JSON嵌套数组
- 在使用Polymer'加载所有json文件后执行方法;s的核心ajax
- 如何使用json将对象列表从java转换为javascript
- 如何使用 node.js 比较两个 json 数组
- 如何将JSON数据导入我的ejs模板
- 区分JSON中的矩阵和列表列表
- 不显示带有本地json文件数据的谷歌地图脚本
- 如何将json数据显示为html
- 如何为json对象中的段发送array[]
- 分析不带逗号分隔符的 JSON 数据
- jquery JSON 从查询字符串中删除分隔符
- 如何使用多个分隔符拆分 JSON 数组
- JSON Diff将字符串与null分隔符进行比较