JSON parsing returned from Sitecore element web API

I am having trouble parsing the following JSON object from the Sitecore API:

{ "statusCode": 200, "result": { "totalCount": 1, "resultCount": 1, "items": [ { "Category": "PAGE", "Database": "web", "DisplayName": "Profile", "HasChildren": false, "Icon": "/temp/IconCache/Network/32x32/earth.png", "ID": "{7F51AD8B-4A8B-4DA5-87A8-374BEB900801}", "Language": "en", "LongID": "/{11111111-1111-1111-1111-111111111111}/{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}/{D608D67E-01F1-493C-B3B7-23176449CD10}/{7F51AD8B-4A8B-4DA5-87A8-374BEB900801}", "MediaUrl": "/~/icon/Network/48x48/earth.png.aspx", "Name": "Profile", "Path": "/sitecore/content/COMPANY/SITE/PAGE", "Template": "User Defined/COMPANY/Pages/Base Page", "TemplateId": "{661AFEB1-8ECE-4D65-80A6-40AC160898D8}", "TemplateName": "Base Page", "Url": "~/link.aspx?_id=7F51AD8B4A8B4DA587A8374BEB900801&_z=z", "Version": 1, "Fields": { "{B370A8AA-C7D1-4B79-9BD2-C94675808949}": { "Name": "Title", "Type": "Single-Line Text", "Value": "Profile" }, "{55373261-F234-444F-9967-E4821C9ACD2C}": { "Name": "Search Results Text", "Type": "Multi-Line Text", "Value": "" }, "{F7DBD22A-6BE1-4FEE-920C-DF1E688A1224}": { "Name": "Meta Description", "Type": "Multi-Line Text", "Value": "Profile Page" }, "{BC5B4A35-9526-4DF3-A1EB-3C6A01A52777}": { "Name": "Tags", "Type": "Multilist", "Value": "" }, "{2AFDEE31-FF47-4184-9BB5-3D17E283F110}": { "Name": "Enable Meta NoIndex", "Type": "Checkbox", "Value": "" }, "{31D6E245-E63A-4749-90F5-225892F29DB7}": { "Name": "Enable Meta NoFollow", "Type": "Checkbox", "Value": "" }, "{A79C9551-A6F4-4E9E-9CF4-3DE68C1E9BAB}": { "Name": "Browser Title", "Type": "Single-Line Text", "Value": "" }, "{4A907846-00BB-4417-BA0E-21B16F5F9875}": { "Name": "Open Text", "Type": "Multi-Line Text", "Value": "" } } } ] } } 

The problem is the Fields property - it should be some list of fields, but instead it looks like separate nested properties, where the name of each property is "{id}".

I wanted to do something like JsonConvert.DeserializeObject<Sitecore.Data.Items.Item>(jsonString) , but I had no success. I would rather not write my own deserializer, but this seems to be the only option.

Even if I wanted to use dyanmic types, I could reach jObject.result.items [0] .Fields ... but what then? I cannot assume that I will always know the identifiers of these fields.

So, a long story, here are my questions:

  • Is there any other way to interact with the Sitecore API that will help me?
  • Are there any problems with ids-as-property names when parsing / deserializing JSON?

For what it's worth, this object comes from the Sitecore API, which I call from a C # application using this approach:

 var request = (HttpWebRequest)WebRequest.Create(itemUrl); request.Headers.Add("X-Scitemwebapi-Username", apiUsername); request.Headers.Add("X-Scitemwebapi-Password", password); // get response var response = (HttpWebResponse)request.GetResponse(); var responseStream = response.GetResponseStream(); 

(I don’t think this is really important for solving the JSON problem specifically, but maybe someone has seen this before and knows a different way?)

Thanks in advance.

+2
source share
1 answer

Using JSON.Net, I did it as follows:

 string json = "{\"statusCode\": 200, \"result\": { \"totalCount\": 1, \"resultCount\": 1, \"items\": [ { \"Category\": \"PAGE\", \"Database\": \"web\", \"DisplayName\": \"Profile\", \"HasChildren\": false, \"Icon\": \"/temp/IconCache/Network/32x32/earth.png\", \"ID\": \"{7F51AD8B-4A8B-4DA5-87A8-374BEB900801}\", \"Language\": \"en\", \"LongID\": \"/{11111111-1111-1111-1111-111111111111}/{0DE95AE4-41AB-4D01-9EB0-67441B7C2450}/{110D559F-DEA5-42EA-9C1C-8A5DF7E70EF9}/{D608D67E-01F1-493C-B3B7-23176449CD10}/{7F51AD8B-4A8B-4DA5-87A8-374BEB900801}\", \"MediaUrl\": \"/~/icon/Network/48x48/earth.png.aspx\", \"Name\": \"Profile\", \"Path\": \"/sitecore/content/COMPANY/SITE/PAGE\", \"Template\": \"User Defined/COMPANY/Pages/Base Page\", \"TemplateId\": \"{661AFEB1-8ECE-4D65-80A6-40AC160898D8}\", \"TemplateName\": \"Base Page\", \"Url\": \"~/link.aspx?_id=7F51AD8B4A8B4DA587A8374BEB900801&amp;_z=z\", \"Version\": 1, \"Fields\": { \"{B370A8AA-C7D1-4B79-9BD2-C94675808949}\": { \"Name\": \"Title\", \"Type\": \"Single-Line Text\", \"Value\": \"Profile\" }, \"{55373261-F234-444F-9967-E4821C9ACD2C}\": { \"Name\": \"Search Results Text\", \"Type\": \"Multi-Line Text\", \"Value\": \"\" }, \"{F7DBD22A-6BE1-4FEE-920C-DF1E688A1224}\": { \"Name\": \"Meta Description\", \"Type\": \"Multi-Line Text\", \"Value\": \"Profile Page\" }, \"{BC5B4A35-9526-4DF3-A1EB-3C6A01A52777}\": { \"Name\": \"Tags\", \"Type\": \"Multilist\", \"Value\": \"\" }, \"{2AFDEE31-FF47-4184-9BB5-3D17E283F110}\": { \"Name\": \"Enable Meta NoIndex\", \"Type\": \"Checkbox\", \"Value\": \"\" }, \"{31D6E245-E63A-4749-90F5-225892F29DB7}\": { \"Name\": \"Enable Meta NoFollow\", \"Type\": \"Checkbox\", \"Value\": \"\" }, \"{A79C9551-A6F4-4E9E-9CF4-3DE68C1E9BAB}\": { \"Name\": \"Browser Title\", \"Type\": \"Single-Line Text\", \"Value\": \"\" }, \"{4A907846-00BB-4417-BA0E-21B16F5F9875}\": { \"Name\": \"Open Text\", \"Type\": \"Multi-Line Text\", \"Value\": \"\" } } } ] }}"; JToken desJson = JObject.Parse(json); 

Now, to get an element (e.g. statusCode), you can do the following:

 int statusCode = (int)desJson.SelectToken("statusCode"); Console.WriteLine(statusCode); 

Answer:

enter image description here

Hope this helps.

To see Fields, for example, you can do the following:

 JToken desJson = JObject.Parse(json); var test = desJson.SelectToken("result"); Console.WriteLine(test.Last.Last[0].Last); 

Instead of test.Last.Last[0].Last you can do this in a loop or recursion. it was just an example.

Result:

enter image description here

0
source

All Articles