Reputation: 3749
I am currently trying to create a stock chart for NASDAQ, Dow Jones, and S&P 500. I cannot find any API (within reasonable pricing) to create this so I have been dabbling with the Yahoo Finance Chart API. It currently supports JSON, CSV, and XML. The performance is less than ideal when parsing XML or CSV so I would like to use the JSON response but I am running into issues. The JSON response does not actually return valid JSON. Does anyone have any insight on how to parse this in iOS or have an alternative suggestion?
Here is the JSON URL: http://chartapi.finance.yahoo.com/instrument/1.1/%5EIXIC/chartdata;type=close;range=1d/json/
Upvotes: 0
Views: 1493
Reputation: 415
you need to do javascript eval as follows:
window.finance_charts_json_callback(data) { return data; }
let json_resp = eval(resp);
in ios, you can create javascript interpreter and eval it.
Upvotes: 0
Reputation: 107191
If you are using iOS 5 or greater you can use the NSJSONSerialization for this.
NSData *data = [jsonString dataUsingEncoding:NSUTF8StringEncoding];
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
But the issue is if the JSON is not valid you can't parse it using NSJSONSerialization
I have successfully changed it to a valid JSON like:
{
"finance_charts_json_callback": {
"meta": {
"uri": "/instrument/1.1/^IXIC/chartdata;type=close;range=1d/json/",
"ticker": "^ixic",
"unit": "MIN",
"timezone": "EST",
"currency": "USD",
"gmtoffset": -18000,
"previous_close": "3179.1001"
},
"Timestamp": {
"min": 1359988200,
"max": 1360011600
},
"labels": [
1359990000,
1359993600,
1359997200,
1360000800,
1360004400,
1360008000,
1360011600
],
"ranges": {
"close": {
"min": 3131.04,
"max": 3168.8701
}
},
"series": [
{
"Timestamp": 1359988218,
"close": 3160.5601
},
{
"Timestamp": 1359997260,
"close": 3139.6799
},
{
"Timestamp": 1359997320,
"close": 3139.55
},
{
"Timestamp": 1359997380,
"close": 3140.3501
},
{
"Timestamp": 1359997440,
"close": 3140.0601
},
{
"Timestamp": 1359997500,
"close": 3140.0601
},
{
"Timestamp": 1359997560,
"close": 3140.1599
},
{
"Timestamp": 1359997620,
"close": 3139.1799
},
{
"Timestamp": 1359997680,
"close": 3137.1899
},
{
"Timestamp": 1359997740,
"close": 3135.71
},
{
"Timestamp": 1359997800,
"close": 3136.54
},
{
"Timestamp": 1359997860,
"close": 3136.78
},
{
"Timestamp": 1359997920,
"close": 3137.74
},
{
"Timestamp": 1359997980,
"close": 3139.3301
},
{
"Timestamp": 1359998040,
"close": 3139.2
},
{
"Timestamp": 1359998100,
"close": 3139.0701
},
{
"Timestamp": 1359998160,
"close": 3139.04
},
{
"Timestamp": 1359998220,
"close": 3139.54
},
{
"Timestamp": 1359998280,
"close": 3139.8301
},
{
"Timestamp": 1359998340,
"close": 3139.51
},
{
"Timestamp": 1359998400,
"close": 3139.8
},
{
"Timestamp": 1359998460,
"close": 3139.97
},
{
"Timestamp": 1359998520,
"close": 3138.78
},
{
"Timestamp": 1359998580,
"close": 3138.1699
},
{
"Timestamp": 1359998640,
"close": 3138.75
},
{
"Timestamp": 1359998700,
"close": 3139.78
},
{
"Timestamp": 1359998760,
"close": 3140.4299
},
{
"Timestamp": 1359998820,
"close": 3141.01
},
{
"Timestamp": 1359998880,
"close": 3141.2
},
{
"Timestamp": 1359998999,
"close": 3141.0701
},
{
"Timestamp": 1359999000,
"close": 3141.47
},
{
"Timestamp": 1359999060,
"close": 3141.79
},
{
"Timestamp": 1359999120,
"close": 3141.8201
},
{
"Timestamp": 1359999180,
"close": 3141.8701
},
{
"Timestamp": 1359999240,
"close": 3141.72
},
{
"Timestamp": 1359999300,
"close": 3141.04
},
{
"Timestamp": 1359999360,
"close": 3142.0801
},
{
"Timestamp": 1359999420,
"close": 3141.9099
},
{
"Timestamp": 1359999480,
"close": 3142.4199
},
{
"Timestamp": 1359999540,
"close": 3142.97
},
{
"Timestamp": 1359999600,
"close": 3142.6899
},
{
"Timestamp": 1359999660,
"close": 3143.3899
},
{
"Timestamp": 1359999720,
"close": 3143.1599
},
{
"Timestamp": 1359999780,
"close": 3143.45
},
{
"Timestamp": 1359999840,
"close": 3143.26
},
{
"Timestamp": 1359999900,
"close": 3143.1699
},
{
"Timestamp": 1359999960,
"close": 3142.4099
},
{
"Timestamp": 1360000020,
"close": 3142.1799
},
{
"Timestamp": 1360000080,
"close": 3142
},
{
"Timestamp": 1360000140,
"close": 3142.28
},
{
"Timestamp": 1360000200,
"close": 3142.22
},
{
"Timestamp": 1360000260,
"close": 3141.75
},
{
"Timestamp": 1360000320,
"close": 3140.8101
},
{
"Timestamp": 1360000380,
"close": 3140.4399
},
{
"Timestamp": 1360000440,
"close": 3140.2
},
{
"Timestamp": 1360000500,
"close": 3140.3201
},
{
"Timestamp": 1360000560,
"close": 3140.1899
},
{
"Timestamp": 1360000620,
"close": 3140.4199
},
{
"Timestamp": 1360000680,
"close": 3140.21
},
{
"Timestamp": 1360000740,
"close": 3140.48
},
{
"Timestamp": 1360000800,
"close": 3140.1001
},
{
"Timestamp": 1360000860,
"close": 3140.3501
},
{
"Timestamp": 1360000920,
"close": 3140.6101
},
{
"Timestamp": 1360000980,
"close": 3140.24
},
{
"Timestamp": 1360001040,
"close": 3141.0601
},
{
"Timestamp": 1360001100,
"close": 3141.27
},
{
"Timestamp": 1360001160,
"close": 3141.5701
},
{
"Timestamp": 1360001220,
"close": 3141.6001
},
{
"Timestamp": 1360001280,
"close": 3142.8601
},
{
"Timestamp": 1360001340,
"close": 3142.8401
},
{
"Timestamp": 1360001400,
"close": 3142.6399
},
{
"Timestamp": 1360001460,
"close": 3142.8701
},
{
"Timestamp": 1360001520,
"close": 3143.1001
},
{
"Timestamp": 1360001580,
"close": 3142.8501
},
{
"Timestamp": 1360001640,
"close": 3142.8
},
{
"Timestamp": 1360001700,
"close": 3142.5901
},
{
"Timestamp": 1360001760,
"close": 3140.8501
},
{
"Timestamp": 1360001820,
"close": 3140.5
},
{
"Timestamp": 1360001880,
"close": 3140.77
},
{
"Timestamp": 1360001940,
"close": 3141.8201
},
{
"Timestamp": 1360002000,
"close": 3141.71
},
{
"Timestamp": 1360002060,
"close": 3141.9399
},
{
"Timestamp": 1360002120,
"close": 3142.49
},
{
"Timestamp": 1360002180,
"close": 3142.1399
},
{
"Timestamp": 1360002240,
"close": 3142.6499
},
{
"Timestamp": 1360002300,
"close": 3142.3999
},
{
"Timestamp": 1360002360,
"close": 3141.72
},
{
"Timestamp": 1360002420,
"close": 3141.77
},
{
"Timestamp": 1360002480,
"close": 3141.1799
},
{
"Timestamp": 1360002540,
"close": 3139.8301
},
{
"Timestamp": 1360002600,
"close": 3139.8501
},
{
"Timestamp": 1360002660,
"close": 3138.25
},
{
"Timestamp": 1360002720,
"close": 3138.74
},
{
"Timestamp": 1360002780,
"close": 3138.3799
},
{
"Timestamp": 1360002840,
"close": 3138.2
},
{
"Timestamp": 1360002900,
"close": 3138.24
},
{
"Timestamp": 1360002960,
"close": 3138.99
},
{
"Timestamp": 1360003020,
"close": 3138.8401
},
{
"Timestamp": 1360003080,
"close": 3138.5801
},
{
"Timestamp": 1360003140,
"close": 3138.3301
},
{
"Timestamp": 1360003200,
"close": 3139.0801
},
{
"Timestamp": 1360003260,
"close": 3139.25
},
{
"Timestamp": 1360003320,
"close": 3139.05
},
{
"Timestamp": 1360003380,
"close": 3139.03
},
{
"Timestamp": 1360003440,
"close": 3138.99
},
{
"Timestamp": 1360003500,
"close": 3137.99
},
{
"Timestamp": 1360003560,
"close": 3137.3601
},
{
"Timestamp": 1360003679,
"close": 3135.8799
},
{
"Timestamp": 1360003680,
"close": 3136
},
{
"Timestamp": 1360003740,
"close": 3136.49
},
{
"Timestamp": 1360003800,
"close": 3136.52
},
{
"Timestamp": 1360003860,
"close": 3135.3899
},
{
"Timestamp": 1360003920,
"close": 3135.77
},
{
"Timestamp": 1360003980,
"close": 3135.8501
},
{
"Timestamp": 1360004040,
"close": 3136.47
},
{
"Timestamp": 1360004100,
"close": 3136.4299
},
{
"Timestamp": 1360004160,
"close": 3137.46
},
{
"Timestamp": 1360004220,
"close": 3137.7
},
{
"Timestamp": 1360004280,
"close": 3137.55
},
{
"Timestamp": 1360004340,
"close": 3137.6599
},
{
"Timestamp": 1360004400,
"close": 3136.26
},
{
"Timestamp": 1360004460,
"close": 3136.6101
},
{
"Timestamp": 1360004520,
"close": 3137.02
},
{
"Timestamp": 1360004580,
"close": 3137.54
},
{
"Timestamp": 1360004640,
"close": 3138.21
},
{
"Timestamp": 1360004700,
"close": 3137.9199
},
{
"Timestamp": 1360004760,
"close": 3137.9299
},
{
"Timestamp": 1360004820,
"close": 3138.3201
},
{
"Timestamp": 1360004880,
"close": 3138.3201
},
{
"Timestamp": 1360004940,
"close": 3137.5801
},
{
"Timestamp": 1360005000,
"close": 3138.0701
},
{
"Timestamp": 1360005060,
"close": 3138.3301
},
{
"Timestamp": 1360005120,
"close": 3138.3701
},
{
"Timestamp": 1360005180,
"close": 3138.26
},
{
"Timestamp": 1360005240,
"close": 3138.23
},
{
"Timestamp": 1360005300,
"close": 3138.5
},
{
"Timestamp": 1360005360,
"close": 3139.23
},
{
"Timestamp": 1360005420,
"close": 3139.1899
},
{
"Timestamp": 1360005480,
"close": 3138.75
},
{
"Timestamp": 1360005540,
"close": 3137.6799
},
{
"Timestamp": 1360005600,
"close": 3139.03
},
{
"Timestamp": 1360005660,
"close": 3138.46
},
{
"Timestamp": 1360005720,
"close": 3138.05
},
{
"Timestamp": 1360005780,
"close": 3137.96
},
{
"Timestamp": 1360005840,
"close": 3138.1101
},
{
"Timestamp": 1360005900,
"close": 3136.8701
},
{
"Timestamp": 1360005960,
"close": 3136.71
},
{
"Timestamp": 1360006020,
"close": 3136.73
},
{
"Timestamp": 1360006080,
"close": 3138.22
},
{
"Timestamp": 1360006140,
"close": 3139.8501
},
{
"Timestamp": 1360006200,
"close": 3140.49
},
{
"Timestamp": 1360006260,
"close": 3140.8201
},
{
"Timestamp": 1360006320,
"close": 3139.8401
},
{
"Timestamp": 1360006380,
"close": 3140.28
},
{
"Timestamp": 1360006440,
"close": 3139.73
},
{
"Timestamp": 1360006500,
"close": 3139.3
},
{
"Timestamp": 1360006560,
"close": 3140.1599
},
{
"Timestamp": 1360006620,
"close": 3139.6299
},
{
"Timestamp": 1360006680,
"close": 3140.0901
},
{
"Timestamp": 1360006740,
"close": 3140.24
},
{
"Timestamp": 1360006800,
"close": 3140.3101
},
{
"Timestamp": 1360006860,
"close": 3140.8401
},
{
"Timestamp": 1360006920,
"close": 3140.95
},
{
"Timestamp": 1360006980,
"close": 3140.8799
},
{
"Timestamp": 1360007040,
"close": 3142.1101
},
{
"Timestamp": 1360007100,
"close": 3142.1399
},
{
"Timestamp": 1360007160,
"close": 3141.8301
},
{
"Timestamp": 1360007220,
"close": 3141.0701
},
{
"Timestamp": 1360007280,
"close": 3140.99
},
{
"Timestamp": 1360007340,
"close": 3140.79
},
{
"Timestamp": 1360007400,
"close": 3141.1499
},
{
"Timestamp": 1360007460,
"close": 3140.76
},
{
"Timestamp": 1360007520,
"close": 3139.6499
},
{
"Timestamp": 1360007580,
"close": 3140.0701
},
{
"Timestamp": 1360007640,
"close": 3140.51
},
{
"Timestamp": 1360007700,
"close": 3140.98
},
{
"Timestamp": 1360007760,
"close": 3141.3601
},
{
"Timestamp": 1360007820,
"close": 3142.46
},
{
"Timestamp": 1360007880,
"close": 3143.3899
},
{
"Timestamp": 1360007940,
"close": 3143.24
},
{
"Timestamp": 1360008000,
"close": 3142.01
},
{
"Timestamp": 1360008060,
"close": 3142.02
},
{
"Timestamp": 1360008120,
"close": 3141.0701
},
{
"Timestamp": 1360008180,
"close": 3141.25
},
{
"Timestamp": 1360008240,
"close": 3141.3999
},
{
"Timestamp": 1360008300,
"close": 3141.3799
},
{
"Timestamp": 1360008360,
"close": 3141.74
},
{
"Timestamp": 1360008420,
"close": 3141.96
},
{
"Timestamp": 1360008480,
"close": 3141.3201
},
{
"Timestamp": 1360008540,
"close": 3140.79
},
{
"Timestamp": 1360008600,
"close": 3140.8201
},
{
"Timestamp": 1360008660,
"close": 3140.73
},
{
"Timestamp": 1360008720,
"close": 3139.6299
},
{
"Timestamp": 1360008780,
"close": 3139.54
},
{
"Timestamp": 1360008840,
"close": 3140.29
},
{
"Timestamp": 1360008900,
"close": 3140.3899
},
{
"Timestamp": 1360008960,
"close": 3140
},
{
"Timestamp": 1360009020,
"close": 3140.04
},
{
"Timestamp": 1360009080,
"close": 3139.8101
},
{
"Timestamp": 1360009140,
"close": 3140.1799
},
{
"Timestamp": 1360009200,
"close": 3139.9099
},
{
"Timestamp": 1360009260,
"close": 3139.8899
},
{
"Timestamp": 1360009320,
"close": 3140.22
},
{
"Timestamp": 1360009380,
"close": 3140.1899
},
{
"Timestamp": 1360009440,
"close": 3138.8501
},
{
"Timestamp": 1360009500,
"close": 3140.3301
},
{
"Timestamp": 1360009560,
"close": 3141.0901
},
{
"Timestamp": 1360009679,
"close": 3141.97
},
{
"Timestamp": 1360009680,
"close": 3141.7
},
{
"Timestamp": 1360009740,
"close": 3141.73
},
{
"Timestamp": 1360009800,
"close": 3140.1399
},
{
"Timestamp": 1360009860,
"close": 3139.6499
},
{
"Timestamp": 1360009920,
"close": 3138.95
},
{
"Timestamp": 1360009980,
"close": 3138.49
},
{
"Timestamp": 1360010040,
"close": 3138.1001
},
{
"Timestamp": 1360011600,
"close": 3131.5
}
]
}
}
You need to do the same by replacing the invalid character using the various functions provided by the NSString class and check it is valid using jsonlint tool.
Upvotes: 0
Reputation: 6625
Update:
Indeed, the response is malformed as well. I tried the URL with a different ticker symbol and it looks like there is a stray "
mark in the output in the previous_close
field. If you remove the stray "
mark, it should validate properly.
"meta" :
{
"uri" :"/instrument/1.1/ITW/chartdata;type=close;range=1d/json/?callback=",
"ticker" : "itw",
"unit" : "MIN",
"timezone" : "EST",
"currency" : "USD",
"gmtoffset" : -18000,
"previous_close" : 62.9000"
}
~
Original:
The response returned is in JSONP format.
finance_charts_json_callback( {
...
} )
Off the cuff, you should be able to strip away finance_charts_json_callback(
from the start and the trailing )
from the end and end up with valid JSON data.
Upvotes: 1