在没有逗号分隔符的情况下解析json数据

时间:2016-03-21 02:50:26

标签: javascript arrays json

我的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+",");
    }
  });
}]);

8 个答案:

答案 0 :(得分:2)

此格式通常称为"换行符分隔的JSON"或" ndjson&#34 ;;有几个模块可以解析这个问题,但是如果您的数据集很小并且您可以一次完成所有操作,那么您就走在了正确的轨道上:

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。您希望将记录变为适合您的应用程序的任何数据结构,因此它实际上取决于您正在寻找的内容,但该示例可能会让您开始。

我真的不建议在解析之前尝试将您正在接收的数据变为其他格式;它很脆弱。您将发现以您提供的方式解析数据更安全,更可重用,然后将其转换为适合您应用程序的数据结构。

答案 1 :(得分:2)

$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
});

答案 2 :(得分:1)

您的JSON需要是单个对象或数组。仅使用逗号连接一堆对象不会定义单个JSON对象。尝试这样做以获得可解析的对象数组:

var nuarr = data.toString().split("\n");
myjson = '[' + nuarr.join(',') + ']';

然后JSON.parse(myjson)应该返回一个对象数组。或者,您可以将nuarr的每个元素映射到它的JSON解析值,并将结果收集到另一个数组中。

答案 3 :(得分:1)

$ 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
});

答案 4 :(得分:0)

var myJson = nuarr.join(',');

但是你真的想做什么?您的代码正在使用添加到数组中的逗号来推送字符串,因此最终使用

["{...},", "{...},", ...]

答案 5 :(得分:0)

在我看来,你有一组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); });

  });

}]);

答案 6 :(得分:0)

使用正则表达式分割成行,然后将每一行映射到其JSON解析的等价物中,从而产生每行上的对象数组:

input . match(/^.*$/gm) . map(JSON.parse)

或者使用split作为其他答案建议:

input . split('\n') . map(JSON.parse)

答案 7 :(得分:0)

尽管看起来很愚蠢,但我们厌倦了使用逗号和引号与JSON,以及没有评论或多行字符串。

知道道格拉斯·克罗克福德和他的门徒会哭泣' Blasphemy',我们继续为我们自己的轻松Json语法编写规范,解析器和格式化器。

事实上,你并不真正需要逗号,而且仅在少数特殊情况下才需要引用。而且你也不需要换行。

使用轻松的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

链接到NPM https://www.npmjs.com/package/really-relaxed-json

在此处粘贴示例以查看解析是多么容易: http://www.relaxedjson.org/docs/converter.html