Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 不使用逗号分隔符解析json数据_Javascript_Arrays_Json - Fatal编程技术网

Javascript 不使用逗号分隔符解析json数据

Javascript 不使用逗号分隔符解析json数据,javascript,arrays,json,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":8

我的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需要是单个对象或数组。仅仅用逗号将一组对象连接在一起并不能定义一个JSON对象。请尝试此操作以获取可解析的对象数组:

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

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

这种格式通常称为“换行分隔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
})
现在,假设
12345678
是所需记录的id,则可以将单个记录寻址为
recordHash['12345678']
。您可能希望将记录变异为对应用程序有意义的任何数据结构,因此这实际上取决于您要查找的内容,但该示例可能会帮助您开始

我真的不建议在解析之前尝试将接收到的数据转换成其他格式;它易碎。您会发现,以提供数据的方式解析数据,然后将其转换为对您的应用程序有意义的任何数据结构,会更安全、更可重用

var myJson = nuarr.join(',');
但你到底想做什么?您的代码正在将添加了逗号的字符串推送到数组中,因此以


[“{…},,“{…},,…]”
$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对象的集合,分隔符是换行符

试试这个:

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

  });

}]);

使用regexp拆分为行,然后将每行映射到其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和他的门徒会大喊“亵渎神明”,我们开始为自己的轻松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}
  }
]
链接到规范:

链接到NPM

将示例粘贴到此处以查看解析有多容易:

这根本不是JSON。您可以随意更改JSON吗?如果是这样,请用“[”和“]”(不带引号)将数据包装起来,并在每一行(但不是最后一行)的末尾添加“,”。您的第5-9行所做的正是
map
所做的,更详细地说。继续@milkandtang-因为您已经有了一个ndjson格式的文件,所以有一个Node.js工具包,请尝试
ndjson过滤器
ndjson映射
ndjson reduce