Related
I need to search the following JSON response. I have no control over how the JSON is returned to me or how it is nested. I am using Restsharp by default, but I am open to whatever method helps me accomplish the task.
{
"response": [
{
"id": 1008,
"brandId": 74,
"collectionId": 32,
"productTypeId": 1,
"nominalCodeStock": "1200",
"nominalCodePurchases": "5002",
"nominalCodeSales": "4000",
"seasonIds": [
],
"identity": {
"sku": "SKU0001",
"isbn": "0684843285",
"ean": "ISNB09712345",
"upc": "5778400001",
"barcode": "738737638"
},
"productGroupId": 0,
"featured": false,
"stock": {
"stockTracked": true,
"weight": {
"magnitude": 0.7
},
"dimensions": {
"length": 2,
"height": 12,
"width": 5,
"volume": 120
}
},
"financialDetails": {
"taxCode": {
"id": 7,
"code": "T20"
}
},
"salesChannels": [
{
"salesChannelName": "Brightpearl",
"productName": "Product B",
"productCondition": "new",
"categories": [
{
"categoryCode": "276"
},
{
"categoryCode": "295"
}
],
"description": {
"languageCode": "en",
"text": "Some description",
"format": "HTML_FRAGMENT"
},
"shortDescription": {
"languageCode": "en",
"text": "Some short description",
"format": "HTML_FRAGMENT"
}
}
],
"composition": {
"bundle": false
},
"variations": [
{
"optionId": 1,
"optionName": "Colour",
"optionValueId": 1,
"optionValue": "Black"
},
{
"optionId": 3,
"optionName": "Colour",
"optionValueId": 9,
"optionValue": "Black"
}
],
"warehouses": {
"2": {
"defaultLocationId": 5,
"reorderLevel": 1,
"reorderQuantity": 0
},
"3": {
"defaultLocationId": 0,
"reorderLevel": 1,
"reorderQuantity": 1
}
},
"createdOn": "2015-01-08T17:57:18.000Z",
"updatedOn": "2015-04-01T13:17:58.000Z",
"reporting": {
"categoryId": 353,
"subcategoryId": 369,
"seasonId": 2
},
"primarySupplierId": 202,
"status": "LIVE",
"salesPopupMessage": "Offer the extended warranty",
"version": 1192098806000
}
]
}
Specifically I need to retrieve the categoryCode values. I'm lost on this one. Any direction is much appreciated.
I am trying to get my head around a specific problem to decide whether to take the plunge in converting some personal projects to MongoDb after completing a basic course last week. What I am trying to achieve is a representation of my data based on grouping and then ultimately selecting specific parts of that group to create a new projection which shows my final result. In the code presently, we do the grouping and then do a sub-select to create the final dataset, I am hoping this can be done in a single hit.
Example document
{
"_id": {
"$oid": "600d88b0d7016d5675cd59bd"
},
"DeviceId": {
"$oid": "600d729764ea780882ac559b"
},
"UserId": {
"$oid": "600b660eff59aab915985b1d"
},
"Date": {
"$date": {
"$numberLong": "1611499696095"
}
},
"Records": [
{
"Count": {
"$numberInt": "10"
},
"Test1": {
"Inconclusive": null,
"Passed": true,
"Failed": null
},
"Test2": {
"Inconclusive": null,
"Passed": true,
"Failed": null
}
},
{
"Count": {
"$numberInt": "15"
},
"Test1": {
"Inconclusive": true,
"Passed": null,
"Failed": null
},
"Test2": {
"Inconclusive": null,
"Passed": true,
"Failed": null
}
},
{
"Count": {
"$numberInt": "15"
},
"Test1": {
"Inconclusive": true,
"Passed": null,
"Failed": null
},
"Test2": {
"Inconclusive": null,
"Passed": null,
"Failed": true
}
}
]
}
Ultimately, what I am trying to get is this as close to this as possible;
{
"DeviceId": "600d729764ea780882ac559b",
"Test1Inconclusive": 30,
"Test1Passed": 10,
"Test1Failed": 0,
"Test2Inconclusive": 0,
"Test2Passed": 25,
"Test2Failed": 15
}
So far, all I have managed to get is the data grouped and it is at this point in the existing code (Entity Framework/SQL server) that I would use Linq to pull out the SUM'd values.
[{
$match: {
UserId: ObjectId('600b660eff59aab915985b1d')
}
}, {
$unwind: {
path: '$Records'
}
}, {
$group: {
_id: {
DeviceId: '$DeviceId',
Test1Inconclusive: '$Records.Test1.Inconclusive',
Test1Passed: '$Records.Test1.Passed',
Test1Failed: '$Records.Test1.Failed',
Test2Inconclusive: '$Records.Test2.Inconclusive',
Test2Passed: '$Records.Test2.Passed',
Test2Failed: '$Records.Test2.Failed',
},
Count: {
$sum: '$Records.Count'
}
}
}, {}]
I am not sure if it is possible to do what I want, and if so how the do the next projection step while performing a subselect of this grouped data. It might even be that my approach is flawed from the start, so feel free to change it completely.
Bonus internet points if you can also give me the MongoDb C# syntax for doing the same (on a MongoCollection)
Following on from the initial version by #turivishal, the answer below worked;
db.collection.aggregate([
{
$match: {
UserId: ObjectId("600b660eff59aab915985b1d")
}
},
{
$unwind: {
path: "$Records"
}
},
{
$group: {
_id: "$DeviceId",
Test1Inconclusive: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test1.Inconclusive",
true
]
},
"$Records.Count",
0
]
}
},
Test1Passed: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test1.Passed",
true
]
},
"$Records.Count",
0
]
}
},
Test1Failed: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test1.Failed",
true
]
},
"$Records.Count",
0
]
}
},
Test2Inconclusive: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test2.Inconclusive",
true
]
},
"$Records.Count",
0
]
}
},
Test2Passed: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test2.Passed",
true
]
},
"$Records.Count",
0
]
}
},
Test2Failed: {
$sum: {
$cond: [
{
$eq: [
"$Records.Test2.Failed",
true
]
},
"$Records.Count",
0
]
}
},
Count: {
$sum: "$Records.Count"
}
}
}
])
I have a json string items i.e,
{
"items": [
{
"kind": "youtube#playlistItem",
"etag": "\"uQc-MPTsstrHkWLmeNsM/NAYVM2gp_1c4XbQ9zYswb1-_gnk\"",
"id": "UExGS2IhV2ZJM2tZMTg2MWZZeDR2cS41NEM3RjdGQ0FDRjkwNUQ5",
"snippet": {
"publishedAt": "2017-03-21T20:38:22.000Z",
"channelId": "UCRUNoQu8kdtsY94D9MZ_sXA",
"title": "News Plus 21-03-17",
"description": "News Plus 21-03-17",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/FIXv7nmU/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/FFynmU/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/FIXvnmU/hqdefault.jpg",
"width": 480,
"height": 360
}
},
"channelTitle": "",
"playlistId": "PLFKb5r-iLUmbOhkY1861fYx4vq",
"position": 0,
"resourceId": {
"kind": "youtube#video",
"videoId": "FIXvFylfjwmU"
}
}
},
{
"kind": "youtube#playlistItem",
"etag": "\"uQc-MPTsstrHkeNsM/TKjx1_sGvJVB3tX8cFnxsE\"",
"id": "UExGS2I1ci1pTFVtYk9oc2htryhjrtUNBMTM5RDMyREQ5",
"snippet": {
"publishedAt": "2017-03-21T19:34:48.000Z",
"channelId": "UCtsY94D9MZ_sXA",
"title": "Private video",
"description": "This video is private.",
"channelTitle": "Capital TV",
"playlistId": "PLFKb5r-iLUmbOh861fYx4vq",
"position": 1,
"resourceId": {
"kind": "youtube#video",
"videoId": "VQ1rDS59318"
}
}
},
{
"kind": "youtube#playlistItem",
"etag": "\"uQc-MPTsstrHkWLmeNsM/JXH9kcF8my3r2Yl0OPK3U\"",
"id": "UExGS2I1ci1pTFVtYhV2ZJM2tZMTg2MWZZeDR2BBNzZCQzY5MDk4",
"snippet": {
"publishedAt": "2017-03-21T19:06:41.000Z",
"channelId": "UCRUNtrhjsY94D9MZ_sXA",
"title": "Director NAB Corruption Scandal",
"description": "",
"thumbnails": {
"default": {
"url": "https://i.ytimg.com/vi/BCnejgyQ/default.jpg",
"width": 120,
"height": 90
},
"medium": {
"url": "https://i.ytimg.com/vi/BCnejyQ/mqdefault.jpg",
"width": 320,
"height": 180
},
"high": {
"url": "https://i.ytimg.com/vi/BCneyQ/hqdault.jpg",
"width": 480,
"height": 360
}
},
"channelTitle": "Capital TV",
"playlistId": "PLFKb5r-iLUmbOhkY1861fYx4vq",
"position": 2,
"resourceId": {
"kind": "youtube#video",
"videoId": "BCnhtjty2gyQ"
}
}
}
}
]
}
As items has two elements, But I want to count the number of element present in snippet, how can I count, I have parse the json and try to get length as,
dynamic result = JsonConvert.DeserializeObject("jsonStr");
foreach (var res in result.items)
{
int size = res.snippet.count; // Not working
}
(res.snippet as JObject).Count
Slightly different syntax to aspark's solution,
private static void Main(string[] args)
{
string json = #"
{
a: 1,
b: 2,
c: [
{c1: 'asdas', c2:231},
{c1: 'aaaaaa', c2: 100},
{c1: 'x', c2: 83823}
]
}
";
Console.WriteLine(JObject.Parse(json)["c"].Count());
//following also works
Console.WriteLine(o.Property("c").Value.Count());
//both print 3
}
I have following JToken output. How can I retrieve the 'value' here from TenantID which should be 1 in this case?
{[
{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}
]}
This is my current code :
JToken value;
if (usr.Profile.TryGetValue("tenantid", out value))
{
JObject inner = value["value"].Value<JObject>(); //not working with null error
User.TenantID = (string)value;
}
User.obj = usr.Profile;
EDIT - please find below the complete JToken output :
{[
{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}
]}
Count: 1
First (Newtonsoft.Json.Linq.JContainer): {{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}}
First (Newtonsoft.Json.Linq.JToken): {{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}}
HasValues: true
IsReadOnly: false
Last (Newtonsoft.Json.Linq.JContainer): {{
`"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}}
Last (Newtonsoft.Json.Linq.JToken): {{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}}
Next: (null)
Parent: {"tenantid": [
{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}
]}
Path: "tenantid"
Previous: (null)
Static members:
Non-public members:
IEnumerator:
Root: {{
"name": "Rx Sidhu",
"given_name": "Rx",
"family_name": "Sidhu",
"locale": "en_US",
"emails": [
"ranxdeep#xxx.com",
"ranxdeep#xxx.com",
"ranxdeep#hx.com"
],
"nickname": "ranxdeep#xxx.com",
"email": "ranxdeep#xxx.com",
"picture": "https://apis.live.net/v5.0/f1xxxxxx/picture",
"roles": [
"Account Admin",
"Admin"
],
"tenantid": [
{
"value": 1,
"metadata": {
"userType": 0,
"flags": 8,
"type": {
"type": "INT4",
"name": "Int",
"id": 56
},
"colName": "TenantID"
}
}
],
"email_verified": true,
"clientID": "wxxxvC8",
"updated_at": "2015-07-15T16:26:30.526Z",
"user_id": "windowslive|f1axxxac",
"identities": [
{
"access_token": "EwBwAq1",
"provider": "windowslive",
"user_id": "f1aexxxxxac",
"connection": "windowslive",
"isSocial": true
}
],
"created_at": "2015-07-01T06:08:21.358Z"
}}
Type: 2
I need to check if the tenantID actually exists and then get value, else return null or 0.
You should be able to do:
JObject jObject = JObject.Parse(...);
JToken value = jObject.SelectToken("value");
You parse your object, then the inner contents should be exposed in which you can leverage the SelectToken method to find that specific value.
To build it out a bit, you could potentially do:
public static JToken FindToken<T>(string key, T value)
{
string serialized = NewtonsoftJsonSerializer.Instance.Serialize(value);
var jObject = JObject.Parse(serialized);
var jToken = jObject.SelectToken(key);
if(jToken != null)
return jToken;
return null;
}
I still cannot get the overall picture of your JSON, though have a look at this. It may help you.
var str = #"{
""x"": [{
""value"": 1,
""metadata"": {
""userType"": 0,
""flags"": 8,
""type"": {
""type"":""INT4"",
""name"":""Int"",
""id"": 56
},
""colName"":""TenantID""
}
}
]
}";
var parentJObject = JObject.Parse(str);
var xJArray = (JArray)parentJObject["x"];
// first item in JArray which is the object of interest
// look for the appropriate index of the JObject of your data
var firstJTokenInxJArray = (JObject)xJArray[0];
Console.WriteLine(firstJTokenInxJArray["value"].ToString());
I got what I was looking for :
JToken value;
if (usr.Profile.TryGetValue("tenantid", out value))
{
User.TenantID = (int)value [0] ["value"];
}
I am using Xamarin.iOS to return a JSON and attempt to place it on a UITableView, however I cannot seem to get it to work, here is what I am attempting to do so far:
Main View Controller
This is how I am returning the JSON
var request = new RestRequest {RootElement = "data", Resource = "/users/self/feed"};
request.AddParameter("access_token", instagramAccessToken);
var client = new RestClient ("https://api.instagram.com/v1");
// Edited Client Execution
client.ExecuteAsync(request, response =>
{
RootObject rootObject = JsonConvert.DeserializeObject<RootObject>(response.Content);
table.Source = new TableSource(rootObject.data);
table.ReloadData();
}
);
TableSource Class
public List<RootObject> Data { get; set; }
protected string cellIdentifier = "TableCell";
public TableSource ()
{
Data = new List<T> ();
}
public TableSource(List<T> data)
{
Data = data;
}
public override int RowsInSection (UITableView tableview, int section)
{
return Data.Count;
}
public override void RowSelected (UITableView tableView, NSIndexPath indexPath)
{
if (OnRowSelected != null) {
OnRowSelected (this, new RowSelectedEventArgs (tableView, indexPath));
}
}
public class RowSelectedEventArgs : EventArgs
{
public UITableView tableView { get; set; }
public NSIndexPath indexPath { get; set; }
public RowSelectedEventArgs(UITableView tableView, NSIndexPath indexPath) : base()
{
this.tableView = tableView;
this.indexPath = indexPath;
}
}
public event EventHandler<RowSelectedEventArgs> OnRowSelected;
public override UITableViewCell GetCell (UITableView tableView, MonoTouch.Foundation.NSIndexPath indexPath)
{
UITableViewCell cell = tableView.DequeueReusableCell (cellIdentifier);
// if there are no cells to reuse, create a new one
if (cell == null)
cell = new UITableViewCell (UITableViewCellStyle.Default, cellIdentifier);
// Edited Text
cell.TextLabel.Text = ((Datum)Data[indexPath.Row]).user.username;
return cell;
}
I didn't really have a concrete method of displaying the JSON on the Table, so I would be pretty open to radical change. BTW the JSON loads on the MainViewController perfectly.
JSON Response
Most of your suggestions don't take into consideration how the JSON looks like so here you go:
{
"pagination": {
"next_url": "https://api.instagram.com/v1/users/self/feed?access_token=6489401.88b3fb2.7af2a0355ea24f4590efa1ee82ed0a49&max_id=668439962408115415_16915182",
"next_max_id": "668439962408115415_16915182"
},
"meta": {
"code": 200
},
"data": [
{
"attribution": null,
"tags": [
"selfie"
],
"type": "image",
"location": null,
"comments": {
"count": 0,
"data": []
},
"filter": "Normal",
"created_time": "1393953134",
"link": "http://instagram.com/p/lIO1_jmkkr/",
"likes": {
"count": 14,
"data": [
{
"username": "muahjay",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_304620904_75sq_1392618687.jpg",
"id": "304620904",
"full_name": "Jeanettee Nicole Cambero Gamez"
},
{
"username": "iam_mrsmith31",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_32806209_75sq_1392607367.jpg",
"id": "32806209",
"full_name": "Kiondrix Smith"
},
{
"username": "anniyalation",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_30752906_75sq_1390523572.jpg",
"id": "30752906",
"full_name": "Niya G."
},
{
"username": "fonzo_badmon",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_271402803_75sq_1393641486.jpg",
"id": "271402803",
"full_name": "Slimshady"
}
]
},
"images": {
"low_resolution": {
"url": "http://distilleryimage11.s3.amazonaws.com/e02592b0a3bf11e3b63212d269f676eb_6.jpg",
"width": 306,
"height": 306
},
"thumbnail": {
"url": "http://distilleryimage11.s3.amazonaws.com/e02592b0a3bf11e3b63212d269f676eb_5.jpg",
"width": 150,
"height": 150
},
"standard_resolution": {
"url": "http://distilleryimage11.s3.amazonaws.com/e02592b0a3bf11e3b63212d269f676eb_8.jpg",
"width": 640,
"height": 640
}
},
"users_in_photo": [],
"caption": {
"created_time": "1393953134",
"text": "#Selfie",
"from": {
"username": "kthompkins7",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_5941681_75sq_1378508674.jpg",
"id": "5941681",
"full_name": "kthompkins7"
},
"id": "668849828018145517"
},
"user_has_liked": false,
"id": "668849827690989867_5941681",
"user": {
"username": "kthompkins7",
"website": "",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_5941681_75sq_1378508674.jpg",
"full_name": "kthompkins7",
"bio": "",
"id": "5941681"
}
},
{
"attribution": null,
"tags": [
"rp",
"amen"
],
"type": "image",
"location": null,
"comments": {
"count": 5,
"data": [
{
"created_time": "1393949795",
"text": "#tmcmc Dobson a Christian!!!!",
"from": {
"username": "keelanwillison",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_26089241_75sq_1380511035.jpg",
"id": "26089241",
"full_name": "Keelanwillison"
},
"id": "668821819276579152"
},
{
"created_time": "1393950029",
"text": "Yo my cousin got me a singed autograph from you at the Boston boat show thanks man #a_dobson3",
"from": {
"username": "danthebigboy914",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_27354625_75sq_1393859632.jpg",
"id": "27354625",
"full_name": "Danny Chiappetta"
},
"id": "668823778033324461"
},
{
"created_time": "1393950659",
"text": "Amen",
"from": {
"username": "sandyrodr",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_44889389_75sq_1361591427.jpg",
"id": "44889389",
"full_name": "sandyrodr"
},
"id": "668829062428545715"
},
{
"created_time": "1393950664",
"text": "π",
"from": {
"username": "cherydaily",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_18483862_75sq_1379884114.jpg",
"id": "18483862",
"full_name": "Andrew \"Drew\" Chery"
},
"id": "668829109488636596"
},
{
"created_time": "1393951921",
"text": "Amen",
"from": {
"username": "bostonsonia",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_182219303_75sq_1391293289.jpg",
"id": "182219303",
"full_name": "Sonia"
},
"id": "668839648625348773"
}
]
},
"filter": "Normal",
"created_time": "1393949714",
"link": "http://instagram.com/p/lIIUdggtOj/",
"likes": {
"count": 324,
"data": [
{
"username": "bwest05",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_387702554_75sq_1393739891.jpg",
"id": "387702554",
"full_name": "π₯bbπ₯"
},
{
"username": "babygirl6193",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_23365060_75sq_1384972330.jpg",
"id": "23365060",
"full_name": "babygirl6193"
},
{
"username": "derekmooney1",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_218356294_75sq_1388601101.jpg",
"id": "218356294",
"full_name": "Derek Mooney"
},
{
"username": "zay0613",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_342812999_75sq_1369576584.jpg",
"id": "342812999",
"full_name": "Zay"
}
]
},
"images": {
"low_resolution": {
"url": "http://distilleryimage11.s3.amazonaws.com/0e1b270aa3b811e395af12cdc849cb9b_6.jpg",
"width": 306,
"height": 306
},
"thumbnail": {
"url": "http://distilleryimage11.s3.amazonaws.com/0e1b270aa3b811e395af12cdc849cb9b_5.jpg",
"width": 150,
"height": 150
},
"standard_resolution": {
"url": "http://distilleryimage11.s3.amazonaws.com/0e1b270aa3b811e395af12cdc849cb9b_8.jpg",
"width": 640,
"height": 640
}
},
"users_in_photo": [],
"caption": {
"created_time": "1393949714",
"text": "#RP from #flashgoodwin #AMEN",
"from": {
"username": "a_dobson3",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_203045179_75sq_1374262647.jpg",
"id": "203045179",
"full_name": "a_dobson3"
},
"id": "668821135462420769"
},
"user_has_liked": false,
"id": "668821135110099875_203045179",
"user": {
"username": "a_dobson3",
"website": "",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_203045179_75sq_1374262647.jpg",
"full_name": "a_dobson3",
"bio": "",
"id": "203045179"
}
},
{
"attribution": null,
"tags": [
"tb12"
],
"type": "image",
"location": null,
"comments": {
"count": 169,
"data": [
{
"created_time": "1393952642",
"text": "My guy! The greatest! I just want him to get another ring so the haters can stop saying he hasn't won one since 04. I mean he still won them right? #TomBrady #patriots",
"from": {
"username": "k_aus32",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_39840771_75sq_1390431094.jpg",
"id": "39840771",
"full_name": "k_aus32"
},
"id": "668845703585318559"
},
{
"created_time": "1393952673",
"text": "#heres_jonni9",
"from": {
"username": "allyson21lautner",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_184895764_75sq_1393107648.jpg",
"id": "184895764",
"full_name": "Allyson π"
},
"id": "668845962264823470"
},
{
"created_time": "1393952694",
"text": "Let's go !",
"from": {
"username": "tom12terrific",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_421023272_75sq_1393644166.jpg",
"id": "421023272",
"full_name": "Andrew Estrada"
},
"id": "668846135581853361"
},
{
"created_time": "1393952856",
"text": "β‘",
"from": {
"username": "in_neverland74",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_181245582_75sq_1391928288.jpg",
"id": "181245582",
"full_name": "Karenπ"
},
"id": "668847491935880949"
},
{
"created_time": "1393952914",
"text": "Follow for patriots pics daily!! (Ifollowback)",
"from": {
"username": "ne_patriots_fanpage__",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_983242248_75sq_1391989748.jpg",
"id": "983242248",
"full_name": "New England Patriots Fanpage"
},
"id": "668847980295472912"
},
{
"created_time": "1393952952",
"text": "Best ever; period. Let's see anyone win a ring with the humps he's had to work with, (except Randy).",
"from": {
"username": "calidoso76",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_1101426299_75sq_1392654362.jpg",
"id": "1101426299",
"full_name": "calidoso76"
},
"id": "668848301545604900"
},
{
"created_time": "1393953005",
"text": "Shit just because brady hasn't won a ring since 04 don't mean a thing....one more and he'll have 6.....the most superbowl wins than ANY quarterback EVER. #patriots",
"from": {
"username": "inkandartsosick",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_260242163_75sq_1363337609.jpg",
"id": "260242163",
"full_name": "Eric Hughes"
},
"id": "668848744304723771"
},
{
"created_time": "1393953023",
"text": "πππ",
"from": {
"username": "bvsed_papi_",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_408657565_75sq_1393905141.jpg",
"id": "408657565",
"full_name": "Abel Valleβ’"
},
"id": "668848894913791811"
}
]
},
"filter": "Lo-fi",
"created_time": "1393949267",
"link": "http://instagram.com/p/lIHd-_v8Uj/",
"likes": {
"count": 13685,
"data": [
{
"username": "dollathebarber",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_219503241_75sq_1373905843.jpg",
"id": "219503241",
"full_name": "dollathebarber"
},
{
"username": "emastro23",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_21122956_75sq_1388823730.jpg",
"id": "21122956",
"full_name": "Eddie Mastrocola"
},
{
"username": "pat_fan99",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_304601453_75sq_1377084414.jpg",
"id": "304601453",
"full_name": "Timothy Smith"
},
{
"username": "___adam___q",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_3694047_75sq_1367384028.jpg",
"id": "3694047",
"full_name": "Adam Quinonez"
}
]
},
"images": {
"low_resolution": {
"url": "http://distilleryimage10.s3.amazonaws.com/1c67f514a3b711e383121299eef1f922_6.jpg",
"width": 306,
"height": 306
},
"thumbnail": {
"url": "http://distilleryimage10.s3.amazonaws.com/1c67f514a3b711e383121299eef1f922_5.jpg",
"width": 150,
"height": 150
},
"standard_resolution": {
"url": "http://distilleryimage10.s3.amazonaws.com/1c67f514a3b711e383121299eef1f922_8.jpg",
"width": 640,
"height": 640
}
},
"users_in_photo": [],
"caption": {
"created_time": "1393949267",
"text": "#tb12",
"from": {
"username": "patriots",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_1939080_75sq_1385924433.jpg",
"id": "1939080",
"full_name": "New England Patriots"
},
"id": "668817391815214218"
},
"user_has_liked": false,
"id": "668817391496447267_1939080",
"user": {
"username": "patriots",
"website": "",
"profile_picture": "http://images.ak.instagram.com/profiles/profile_1939080_75sq_1385924433.jpg",
"full_name": "New England Patriots",
"bio": "",
"id": "1939080"
}
},
{
"attribution": null,
"videos": {
"low_resolution": {
"url": "http://distilleryimage4.s3.amazonaws.com/2cb7114aa3b511e3a3e312f545262070_102.mp4",
"width": 480,
"height": 480
},
"standard_resolution": {
"url": "http://distilleryimage4.s3.amazonaws.com/2cb7114aa3b511e3a3e312f545262070_101.mp4",
"width": 640,
"height": 640
}
}
}
]
}
After those two Edits I still have two errors:
Error on Main View Controller
Error on Table Source
No need to assign the Data multiple times. Assign the source once and then call ReloadData().
client.ExecuteAsync(request, response =>
{
var rootObject = JsonConvert.DeserializeObject<RootObject>(response.Content);
table.InvokeOnMainThread(() =>
{
table.Source = new TableSource(rootObject.data);
table.ReloadData();
});
}
);
EDIT: It seems there are four items in the Datum field and the last one is null.
https://github.com/sami1971/SimplyMobile/blob/master/iOS/Samples/TwitterSample/Twitter.cs
ToString() override for Datum:
public override string ToString()
{
if (user == null)
{
return "User is null";
}
return user.full_name;
}
For full sample download the project, open iOS/SimplyMobile.iOS.sln and run Samples/TwitterSample.
You should be able to do something like this:
cell.TextLabel.Text = ((Datum)Data[indexPath.Row]).user.username;
you have to reload tableView when all data retrived from url to your dictionary or array.
you can do this like this
[self.Yourtableview reloadData];