简体   繁体   中英

Parsing JSON returned from the Sitecore Item 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 with the Fields property - it should be some sort of list of fields, but instead, it looks like they are individual nested properties where the name of each property is an "{id}".

I wanted to do something like JsonConvert.DeserializeObject<Sitecore.Data.Items.Item>(jsonString) , but I have not had success. I would really prefer to not have to write a custom deserializer, but its looking like thats my only option.

Even if I wanted to use dyanmic types, I could get as far as jObject.result.items[0].Fields... but then what? I can't presume that I will always know the IDs of these fields.

So, long story short, here's my questions:

  1. Is there another way to interact with the Sitecore API that would help me?
  2. Is there anyway around the ids-as-property-names problem when parsing/deserializing the JSON?

For what it's worth, This object is coming from the Sitecore API, which I am calling out to 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 that really matters for tackling the JSON problem specifically, but maybe someone has seen this before and knows another way around?)

Thanks in advance.

Using JSON.Net I've done this 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 item(eg, statusCode), you can do the following:

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

Console.WriteLine(statusCode);

Answer:

在此处输入图片说明

Hope this helps.

To see Fields,eg, you can do like this:

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 loop or recursion as well. that was just an example.

Result:

在此处输入图片说明

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM