Search code examples
javascriptjsonparsingstringifyoracle-jet

Uncaught SyntaxError: Unexpected end of JSON input at JSON.parse (<anonymous>)


I need some help with this error:

Uncaught SyntaxError: Unexpected end of JSON input
  at JSON.parse (<anonymous>)
  at Object.success (dashboard.js:22)
  at fire (jquery-3.3.1.js:3268)
  at Object.fireWith [as resolveWith] (jquery-3.3.1.js:3398)
  at done (jquery-3.3.1.js:9305)
  at XMLHttpRequest.<anonymous> (jquery-3.3.1.js:9548)

I was trying to transform a string to a JSON object using JSON.parse() which caused the above error. I am using oracleJet and this is my code:

function DashboardViewModel() {
      
    var self = this;
    self.lineTypeValue = ko.observable('curved');
    var scatterSeries = []; 
        
    $.getJSON( "http://localhost:8080/points", function (data) {
        console.info(data);
        var ch = '{"name":"graphe1","items":'+JSON.stringify(data.results[1])+ '}';
        console.info(ch);
        console.info(JSON.parse(scatterSeries));
        scatterSeries.push(JSON.parse(ch));           
    });

    /* chart data */
        
    this.scatterSeriesValue = ko.observableArray(scatterSeries);
        
    self.lineTypeOptions = [
        {id: 'straight', label: 'straight'},
        {id: 'curved', label: 'curved'},
        {id: 'stepped', label: 'stepped'},
        {id: 'segmented', label: 'segmented'},
        {id: 'none', label: 'none'}
    ];
}

The JSON that I got from "http://localhost:8080/points" looked like this:

{
  "results": [
    [
      {
        "b": "0.110547334",
        "cost": "0.000000",
        "w": "1.998889"
      }
    ],
    [
      {
        "x": 0,
        "y": 0
      },
      {
        "x": 1,
        "y": 2
      },
      {
        "x": 2,
        "y": 4
      },
      {
        "x": 3,
        "y": 6
      },
      {
        "x": 4,
        "y": 8
      },
      {
        "x": 5,
        "y": 10
      },
      {
        "x": 6,
        "y": 12
      },
      {
        "x": 7,
        "y": 14
      },
      {
        "x": 8,
        "y": 16
      },
      {
        "x": 9,
        "y": 18
      },
      {
        "x": 10,
        "y": 20
      },
      {
        "x": 11,
        "y": 22
      },
      {
        "x": 12,
        "y": 24
      },
      {
        "x": 13,
        "y": 26
      },
      {
        "x": 14,
        "y": 28
      },
      {
        "x": 15,
        "y": 30
      },
      {
        "x": 16,
        "y": 32
      },
      {
        "x": 17,
        "y": 34
      },
      {
        "x": 18,
        "y": 36
      },
      {
        "x": 19,
        "y": 38
      },
      {
        "x": 20,
        "y": 40
      },
      {
        "x": 21,
        "y": 42
      },
      {
        "x": 22,
        "y": 44
      },
      {
        "x": 23,
        "y": 46
      },
      {
        "x": 24,
        "y": 48
      },
      {
        "x": 25,
        "y": 50
      },
      {
        "x": 26,
        "y": 52
      },
      {
        "x": 27,
        "y": 54
      },
      {
        "x": 28,
        "y": 56
      },
      {
        "x": 29,
        "y": 58
      },
      {
        "x": 30,
        "y": 60
      },
      {
        "x": 31,
        "y": 62
      },
      {
        "x": 32,
        "y": 64
      },
      {
        "x": 33,
        "y": 66
      },
      {
        "x": 34,
        "y": 68
      },
      {
        "x": 35,
        "y": 70
      },
      {
        "x": 36,
        "y": 72
      },
      {
        "x": 37,
        "y": 74
      },
      {
        "x": 38,
        "y": 76
      },
      {
        "x": 39,
        "y": 78
      },
      {
        "x": 40,
        "y": 80
      },
      {
        "x": 41,
        "y": 82
      },
      {
        "x": 42,
        "y": 84
      },
      {
        "x": 43,
        "y": 86
      },
      {
        "x": 44,
        "y": 88
      },
      {
        "x": 45,
        "y": 90
      },
      {
        "x": 46,
        "y": 92
      },
      {
        "x": 47,
        "y": 94
      },
      {
        "x": 48,
        "y": 96
      },
      {
        "x": 49,
        "y": 98
      },
      {
        "x": 50,
        "y": 100
      },
      {
        "x": 51,
        "y": 102
      },
      {
        "x": 52,
        "y": 104
      },
      {
        "x": 53,
        "y": 106
      },
      {
        "x": 54,
        "y": 108
      },
      {
        "x": 55,
        "y": 110
      },
      {
        "x": 56,
        "y": 112
      },
      {
        "x": 57,
        "y": 114
      },
      {
        "x": 58,
        "y": 116
      },
      {
        "x": 59,
        "y": 118
      },
      {
        "x": 60,
        "y": 120
      },
      {
        "x": 61,
        "y": 122
      },
      {
        "x": 62,
        "y": 124
      },
      {
        "x": 63,
        "y": 126
      },
      {
        "x": 64,
        "y": 128
      },
      {
        "x": 65,
        "y": 130
      },
      {
        "x": 66,
        "y": 132
      },
      {
        "x": 67,
        "y": 134
      },
      {
        "x": 68,
        "y": 136
      },
      {
        "x": 69,
        "y": 138
      },
      {
        "x": 70,
        "y": 140
      },
      {
        "x": 71,
        "y": 142
      },
      {
        "x": 72,
        "y": 144
      },
      {
        "x": 73,
        "y": 146
      },
      {
        "x": 74,
        "y": 148
      },
      {
        "x": 75,
        "y": 150
      },
      {
        "x": 76,
        "y": 152
      },
      {
        "x": 77,
        "y": 154
      },
      {
        "x": 78,
        "y": 156
      },
      {
        "x": 79,
        "y": 158
      },
      {
        "x": 80,
        "y": 160
      },
      {
        "x": 81,
        "y": 162
      },
      {
        "x": 82,
        "y": 164
      },
      {
        "x": 83,
        "y": 166
      },
      {
        "x": 84,
        "y": 168
      },
      {
        "x": 85,
        "y": 170
      },
      {
        "x": 86,
        "y": 172
      },
      {
        "x": 87,
        "y": 174
      },
      {
        "x": 88,
        "y": 176
      },
      {
        "x": 89,
        "y": 178
      },
      {
        "x": 90,
        "y": 180
      },
      {
        "x": 91,
        "y": 182
      },
      {
        "x": 92,
        "y": 184
      },
      {
        "x": 93,
        "y": 186
      },
      {
        "x": 94,
        "y": 188
      },
      {
        "x": 95,
        "y": 190
      },
      {
        "x": 96,
        "y": 192
      },
      {
        "x": 97,
        "y": 194
      },
      {
        "x": 98,
        "y": 196
      },
      {
        "x": 99,
        "y": 198
      }
    ]
  ]
}

and I wanted the variable scatterSeries to hold a table like this one:

[
  {
    name: "graphe1",
    items: [
      {
        x: 8,
        y: 2
      },
      {
        x: 15,
        y: 15
      },
      {
        x: 25,
        y: 26
      },
      {
        x: 33,
        y: 22
      },
      {
        x: 36,
        y: 40
      }
    ]
  }
]

I got the string ch in the console:

{
  "name": "graphe1",
  "items": [
    {
      "x": 0,
      "y": 0
    },
    {
      "x": 1,
      "y": 2
    },
    {
      "x": 2,
      "y": 4
    },
    {
      "x": 3,
      "y": 6
    },
    {
      "x": 4,
      "y": 8
    },
    {
      "x": 5,
      "y": 10
    },
    {
      "x": 6,
      "y": 12
    },
    {
      "x": 7,
      "y": 14
    },
    {
      "x": 8,
      "y": 16
    },
    {
      "x": 9,
      "y": 18
    },
    {
      "x": 10,
      "y": 20
    },
    {
      "x": 11,
      "y": 22
    },
    {
      "x": 12,
      "y": 24
    },
    {
      "x": 13,
      "y": 26
    },
    {
      "x": 14,
      "y": 28
    },
    {
      "x": 15,
      "y": 30
    },
    {
      "x": 16,
      "y": 32
    },
    {
      "x": 17,
      "y": 34
    },
    {
      "x": 18,
      "y": 36
    },
    {
      "x": 19,
      "y": 38
    },
    {
      "x": 20,
      "y": 40
    },
    {
      "x": 21,
      "y": 42
    },
    {
      "x": 22,
      "y": 44
    },
    {
      "x": 23,
      "y": 46
    },
    {
      "x": 24,
      "y": 48
    },
    {
      "x": 25,
      "y": 50
    },
    {
      "x": 26,
      "y": 52
    },
    {
      "x": 27,
      "y": 54
    },
    {
      "x": 28,
      "y": 56
    },
    {
      "x": 29,
      "y": 58
    },
    {
      "x": 30,
      "y": 60
    },
    {
      "x": 31,
      "y": 62
    },
    {
      "x": 32,
      "y": 64
    },
    {
      "x": 33,
      "y": 66
    },
    {
      "x": 34,
      "y": 68
    },
    {
      "x": 35,
      "y": 70
    },
    {
      "x": 36,
      "y": 72
    },
    {
      "x": 37,
      "y": 74
    },
    {
      "x": 38,
      "y": 76
    },
    {
      "x": 39,
      "y": 78
    },
    {
      "x": 40,
      "y": 80
    },
    {
      "x": 41,
      "y": 82
    },
    {
      "x": 42,
      "y": 84
    },
    {
      "x": 43,
      "y": 86
    },
    {
      "x": 44,
      "y": 88
    },
    {
      "x": 45,
      "y": 90
    },
    {
      "x": 46,
      "y": 92
    },
    {
      "x": 47,
      "y": 94
    },
    {
      "x": 48,
      "y": 96
    },
    {
      "x": 49,
      "y": 98
    },
    {
      "x": 50,
      "y": 100
    },
    {
      "x": 51,
      "y": 102
    },
    {
      "x": 52,
      "y": 104
    },
    {
      "x": 53,
      "y": 106
    },
    {
      "x": 54,
      "y": 108
    },
    {
      "x": 55,
      "y": 110
    },
    {
      "x": 56,
      "y": 112
    },
    {
      "x": 57,
      "y": 114
    },
    {
      "x": 58,
      "y": 116
    },
    {
      "x": 59,
      "y": 118
    },
    {
      "x": 60,
      "y": 120
    },
    {
      "x": 61,
      "y": 122
    },
    {
      "x": 62,
      "y": 124
    },
    {
      "x": 63,
      "y": 126
    },
    {
      "x": 64,
      "y": 128
    },
    {
      "x": 65,
      "y": 130
    },
    {
      "x": 66,
      "y": 132
    },
    {
      "x": 67,
      "y": 134
    },
    {
      "x": 68,
      "y": 136
    },
    {
      "x": 69,
      "y": 138
    },
    {
      "x": 70,
      "y": 140
    },
    {
      "x": 71,
      "y": 142
    },
    {
      "x": 72,
      "y": 144
    },
    {
      "x": 73,
      "y": 146
    },
    {
      "x": 74,
      "y": 148
    },
    {
      "x": 75,
      "y": 150
    },
    {
      "x": 76,
      "y": 152
    },
    {
      "x": 77,
      "y": 154
    },
    {
      "x": 78,
      "y": 156
    },
    {
      "x": 79,
      "y": 158
    },
    {
      "x": 80,
      "y": 160
    },
    {
      "x": 81,
      "y": 162
    },
    {
      "x": 82,
      "y": 164
    },
    {
      "x": 83,
      "y": 166
    },
    {
      "x": 84,
      "y": 168
    },
    {
      "x": 85,
      "y": 170
    },
    {
      "x": 86,
      "y": 172
    },
    {
      "x": 87,
      "y": 174
    },
    {
      "x": 88,
      "y": 176
    },
    {
      "x": 89,
      "y": 178
    },
    {
      "x": 90,
      "y": 180
    },
    {
      "x": 91,
      "y": 182
    },
    {
      "x": 92,
      "y": 184
    },
    {
      "x": 93,
      "y": 186
    },
    {
      "x": 94,
      "y": 188
    },
    {
      "x": 95,
      "y": 190
    },
    {
      "x": 96,
      "y": 192
    },
    {
      "x": 97,
      "y": 194
    },
    {
      "x": 98,
      "y": 196
    },
    {
      "x": 99,
      "y": 198
    }
  ]
}

Any help?


Solution

  • You are calling:

    JSON.parse(scatterSeries)
    

    But when you defined scatterSeries, you said:

    var scatterSeries = []; 
    

    When you try to parse it as JSON it is converted to a string (""), which is empty, so you reach the end of the string before having any of the possible content of a JSON text.

    scatterSeries is not JSON. Do not try to parse it as JSON.

    data is not JSON either (getJSON will parse it as JSON automatically).

    ch is JSON … but shouldn't be. You should just create a plain object in the first place:

    var ch = {
        "name": "graphe1",
        "items": data.results[1]
    };
    
    scatterSeries.push(ch);
    

    In short, for what you are doing, you shouldn't have JSON.parse anywhere in your code. The only place it should be is in the jQuery library itself.