Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

parsing json data without a comma separator

My JSON is like below

{"_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}}

It is a JSON without comma separation, how to read this file? I tried to parse the JSON and add commas in between, but couldn't do that either.

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+",");
    }
  });
}]);
like image 300
alex Avatar asked Mar 21 '16 02:03

alex


4 Answers

This format is typically called "newline-delimited JSON" or "ndjson"; there are several modules that can parse this, but if you're data set is small and you can do it all at once, you're on the right track:

var ndjson = "..." // assuming your data is already loaded in as a string

var records = ndjson.split('\n').map(function (record) {
    return JSON.parse(record)
})

That simplifies it a bit, but then you have all of your records in an array, as parsed JSON objects. What you do to them after that is up to you, but the key takeaway here is that your JSON is a list of objects, not a single object: you don't want to parse it as a whole, but as individual records.

Say then, you want to create an object whose keys are the individual IDs; that might be helpful:

var recordHash = {}

records.forEach(function (record) {
    recordHash[record._id] = record
})

Now you can address the individual records as recordHash['12345678'] assuming that 12345678 is the id of the record you wanted. You'll want to mutate the records into whatever data structure makes sense for your application, so it really depends on what you're looking for, but that example might get you started.

I really don't recommend trying to mutate the data that you're receiving into some other format before parsing; it's fragile. You'll find it much safer and more re-usable to parse out the data in the way you were provided it, and then transform it into whatever data structure makes sense for your application.

like image 154
milkandtang Avatar answered Oct 08 '22 01:10

milkandtang


$http.get expects that response must be json. You can write your own custom response transformer to do that so.

$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
});
like image 38
Adnan Umer Avatar answered Oct 08 '22 00:10

Adnan Umer


Your JSON needs to be a single object or array. Just joining a bunch of objects together with a comma does not define a single JSON object. Try this instead to get a parsable array of objects:

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

Then JSON.parse(myjson) should return an array of objects. Alternatively, you can just map each element of nuarr to it's JSON-parsed value and collect the results in another array.

like image 24
Ted Hopp Avatar answered Oct 08 '22 02:10

Ted Hopp


$http.get expects that response must be json. You can write your own custom response transformer to do that so.

$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
});
like image 1
Haroon Afandi Avatar answered Oct 08 '22 02:10

Haroon Afandi