Разбор JSON с помощью JSON.NET

У меня есть строка JSON:

 {"responseData": 
     {"results": [
         {"GsearchResultClass": "GblogSearch",
          "title":"\u003cb\u003eParis Hilton\u003c/b\u003e shops at Sydney Michelle boutique in the Beverly Glen \u003cb\u003e...\u003c/b\u003e",
           "titleNoFormatting":"Paris Hilton shops at Sydney Michelle boutique in the Beverly Glen ...",
           "postUrl":"http://www.celebrity-gossip.net/celebrities/hollywood/paris-hilton-sydney-michelle-stockup-215844/",
           "content":"\u003cb\u003eParis Hilton\u003c/b\u003e shops at Sydney Michelle boutique in the Beverly Glen Mall - \u003cb\u003eParis Hilton\u003c/b\u003e: Sydney Michelle Stockup.",
           "author":"The Gossip Girls at (c) gossipgirls.com",
           "blogUrl":"http://www.celebrity-gossip.net/",
           "publishedDate":"Tue, 23 Feb 2010 22:26:00 -0800"
         },
         {"GsearchResultClass":"GblogSearch",
          "title":"\u003cb\u003eParis Hilton\u003c/b\u003e having wardrobe woes as she met with her lawyer",
          "titleNoFormatting":"Paris Hilton having wardrobe woes as she met with her lawyer",
          "postUrl":"http://www.celebrity-gossip.net/celebrities/hollywood/paris-hiltons-wardrobe-woes-215855/",
          "content":"\u003cb\u003eParis Hilton\u003c/b\u003e having wardrobe woes as  she met with her lawyer - \u003cb\u003eParis Hilton's\u003c/b\u003e Wardrobe Woes.",
          "author":"The Gossip Girls at (c) gossipgirls.com","blogUrl":"http://www.celebrity-gossip.net/",
          "publishedDate":"Wed, 24 Feb 2010 11:07:56 -0800"
         },
         {"GsearchResultClass":"GblogSearch",
          "title":"HOT GALLERY: \u003cb\u003eParis Hilton\u003c/b\u003e Turns Her Frown Upside Down | OK \u003cb\u003e...\u003c/b\u003e",
          "titleNoFormatting":"HOT GALLERY: Paris Hilton Turns Her Frown Upside Down | OK ...",
          "postUrl":"http://www.okmagazine.com/2010/02/hot-gallery-paris-hilton-turns-her-frown-upside-down/",
          "content":"\u003cb\u003eParis Hilton\u003c/b\u003e kept her game face on yesterday as she headed to a meeting in Hollywood. The socialite maintained her composure, but eventually cracked a smile, 201002.",
          "author":"Brittany Talarico",
          "blogUrl":"http://www.okmagazine.com/",
          "publishedDate":"Wed, 24 Feb 2010 07:57:10 -0800"
         },
         {"GsearchResultClass":"GblogSearch",
          "title":"Love It Or Hate It: \u003cb\u003eParis Hilton\u003c/b\u003e | ImNotObsessed.com",
          "titleNoFormatting":"Love It Or Hate It: Paris Hilton | ImNotObsessed.com",
          "postUrl":"http://www.imnotobsessed.com/2010/02/24/love-it-or-hate-it-paris-hilton",
          "content":"tweetmeme_url \u003d \"http://www.imnotobsessed.com/2010/02/24/love-it-or-hate-it-\u003cb\u003eparis\u003c/b\u003e-\u003cb\u003ehilton\u003c/b\u003e\";tweetmeme_element_id \u003d '#tweetmeme-widget-139430e62dc37d7a2aa71840d6444572';That's some dress \u003cb\u003eParis Hilton\u003c/b\u003e was seen wearing while shopping in ...",
          "author":"Vera",
          "blogUrl":"http://www.imnotobsessed.com/",
          "publishedDate":"Wed, 24 Feb 2010 10:44:28 -0800"
         }],
    "cursor": { 
        "pages": [
            {"start":"0","label":1},
            {"start":"4","label":2},
            {"start":"8","label":3},
            {"start":"12","label":4},
            {"start":"16","label":5},
            {"start":"20","label":6},
            {"start":"24","label":7},
            {"start":"28","label":8}],
        "estimatedResultCount":"8035445",
        "currentPageIndex":0,
        "moreResultsUrl":"http://blogsearch.google.com/blogsearch?oe\u003dutf8\u0026ie\u003dutf8\u0026safe\u003dactive\u0026source\u003duds\u0026start\u003d0\u0026hl\u003den\u0026q\u003dParis+Hilton"
        }
     }, 
"responseDetails": null, 
"responseStatus": 200}

ред. примечание: для удобства чтения добавлены разрывы строк

и я использую Json.NET для его анализа, однако это дает мне ноль

это мой код:

JObject o = JObject.Parse(json); // <- where json is the string above

string name = (string)o["responseData"];

НО это дает мне эту ошибку:

Can not convert {null} to String.

person C..    schedule 25.02.2010    source источник


Ответы (4)


Вы пробовали что-то вроде?

string gsearchresultclass= (string)o["responseData"]["results"][0]["GsearchResultClass"];
string title= (string)o["responseData"]["results"][0]["title"];
string titlenoformat= (string)o["responseData"]["results"][0]["titleNoFormatting"];
string url = (string)o["responseData"]["results"][0]["postUrl"];
string content = (string)o["responseData"]["results"][0]["content"];
string author = (string)o["responseData"]["results"][0]["author"];
string blogurl = (string)o["responseData"]["results"][0]["blogUrl"];
string date = (string)o["responseData"]["results"][0]["publishedDate"];

Что именно вы пытаетесь получить в переменной имени?

person s_hewitt    schedule 25.02.2010

Используя Json.Net, вы можете десериализовать объект следующим образом:

BlogSearch search = JsonConvert.DeserializeObject<BlogSearch>(content);

Вы бы определили объект BlogSearch следующим образом:

[JsonObject(MemberSerialization.OptIn)]
public class BlogSearch
{
    [JsonProperty(PropertyName = "responseData")]
    public BlogSearchResponse SearchResponse { get; set; }
}

Вы продолжаете определять объекты, пока не получите все интересующие вас объекты.

person Clay Lenhart    schedule 22.04.2010
comment
что произойдет, если это не правильный тип сообщения? генерируется исключение или возвращается ноль? - person Alex Reinking; 29.08.2015

http://msdn.microsoft.com/en-us/library/system.runtime.serialization.json.datacontractjsonserializer.aspx
Это хорошая альтернатива вашему методу, который я бы порекомендовал...
Надеюсь, это поможет...

person Warty    schedule 25.02.2010

Если вы отправляете необработанный объект JSON в веб-API, вы столкнетесь с этой проблемой. Десериализатор ожидает фактическую строку, а не объект или массив. Поскольку он использует JsonMediaTypeFormatter, он не будет знать, как перевести то, что ему передается.

Вам нужно сделать следующее, чтобы избежать null:

public HttpResponseMessage postBlogSearch([FromBody] JToken json){
    var jsonResult = JObject.Parse(json.ToString());
    var name = jsonResult["responseData"].ToString();
}

Дополнительную информацию см. в этой статье.

person peteb    schedule 21.10.2014