首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从苹果的iTunes类型ID服务反序列化JSON的麻烦

从苹果的iTunes类型ID服务反序列化JSON的麻烦
EN

Stack Overflow用户
提问于 2014-10-11 09:10:04
回答 2查看 273关注 0票数 1

从苹果的iTunes类型in服务返回的JSON与我在过去遇到的其他JSON不同。正因为如此,我在构建反序列化类时遇到了困难。

下面是JSON的一个示例(为了清楚起见,我已经将其删减;完整的JSON可以找到这里):

代码语言:javascript
复制
{
    "26": {
        "name": "Podcasts",
        "id": "26",
        "url": "https://itunes.apple.com/us/genre/podcasts/id26?mt=2",
        "subgenres": {
            "1301": {
                "name": "Arts",
                "id": "1301",
                "url": "https://itunes.apple.com/us/genre/podcasts-arts/id1301?mt=2",
                "subgenres": {
                    "1306": {
                        "name": "Food",
                        "id": "1306",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-food/id1306?mt=2"
                    },
                    "1401": {
                        "name": "Literature",
                        "id": "1401",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-literature/id1401?mt=2"
                    },
                    "1402": {
                        "name": "Design",
                        "id": "1402",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-design/id1402?mt=2"
                    },
                    "1405": {
                        "name": "Performing Arts",
                        "id": "1405",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-performing-arts/id1405?mt=2"
                    },
                    "1406": {
                        "name": "Visual Arts",
                        "id": "1406",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-visual-arts/id1406?mt=2"
                    },
                    "1459": {
                        "name": "Fashion & Beauty",
                        "id": "1459",
                        "url": "https://itunes.apple.com/us/genre/podcasts-arts-fashion-beauty/id1459?mt=2"
                    }
                }
            },
            "1321": {
                "name": "Business",
                "id": "1321",
                "url": "https://itunes.apple.com/us/genre/podcasts-business/id1321?mt=2",
                "subgenres": {
                    "1410": {
                        "name": "Careers",
                        "id": "1410",
                        "url": "https: //itunes.apple.com/us/genre/podcasts-business-careers/id1410?mt=2"
                    },
                    "1412": {
                        "name": "Investing",
                        "id": "1412",
                        "url": "https: //itunes.apple.com/us/genre/podcasts-business-investing/id1412?mt=2"
                    },
                    "1413": {
                        "name": "Management&Marketing",
                        "id": "1413",
                        "url": "https: //itunes.apple.com/us/genre/podcasts-business-management/id1413?mt=2"
                    },
                    "1471": {
                        "name": "BusinessNews",
                        "id": "1471",
                        "url": "https: //itunes.apple.com/us/genre/podcasts-business-business/id1471?mt=2"
                    },
                    "1472": {
                        "name": "Shopping",
                        "id": "1472",
                        "url": "https: //itunes.apple.com/us/genre/podcasts-business-shopping/id1472?mt=2"
                    }
                }
            }
        }
    }
}

下面是我接收数据的类:

代码语言:javascript
复制
public class PodcastGenreResult
{
    public PodcastGenreInfo GenreInfo { get; set; }
}

public class PodcastGenreInfo
{
    [JsonProperty("name")]
    public string GenreName { get; set; }
}

下面是反序列化调用:

代码语言:javascript
复制
PodcastGenreResult result = JsonConvert.DeserializeObject<PodcastGenreResult>(sResults);

其中sResults是JSON字符串。我已经确认这个字符串包含正确的数据。

在此之后,不会引发错误,但result.GenreInfo总是为null。我试过其他方法,但这是我觉得最合适的方法。大多数情况下,我使用JsonProperty属性来指定我想要的对象,但在这里我不能这样做,因为根名称会根据我所要求的ID而改变。如何定义类以反序列化数据?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-10-11 15:19:55

这其实是相当普遍的。要处理键是动态的对象,需要反序列化为Dictionary<string, T>,其中T是项类。所以在你的情况下:

代码语言:javascript
复制
Dictionary<string, PodcastGenreInfo> genres = 
    JsonConvert.DeserializeObject<Dictionary<string, PodcastGenreInfo>>(sResults);

还请注意,类型对象的subgenres属性是相同的,因此您也应该将它定义为字典:

代码语言:javascript
复制
public class PodcastGenreInfo
{
    [JsonProperty("name")]
    public string GenreName { get; set; }

    [JsonProperty("subgenres")]
    public Dictionary<string, PodcastGenreInfo> Subgenres { get; set; }
}

下面是一个工作演示:

代码语言:javascript
复制
class Program
{
    static void Main(string[] args)
    {
        using (WebClient client = new WebClient())
        {
            string url = "http://itunes.apple.com/WebObjects/MZStoreServices.woa/ws/genres?id=26";
            string json = client.DownloadString(url);
            var genres = JsonConvert.DeserializeObject<Dictionary<string, PodcastGenreInfo>>(json);
            Dump(new PodcastGenreInfo { GenreName = "Genres", Subgenres = genres }, "");
        }
    }

    private static void Dump(PodcastGenreInfo genre, string indent)
    {
        Console.WriteLine(indent + genre.GenreName);
        if (genre.Subgenres != null)
            foreach (var kvp in genre.Subgenres)
                Dump(kvp.Value, indent + "  ");
    }

    public class PodcastGenreInfo
    {
        [JsonProperty("name")]
        public string GenreName { get; set; }

        [JsonProperty("subgenres")]
        public Dictionary<string, PodcastGenreInfo> Subgenres { get; set; }
    }
}

输出:

代码语言:javascript
复制
Genres
  Podcasts
    Arts
      Design
      Fashion & Beauty
      Food
      Literature
      Performing Arts
      Visual Arts
    Business
      Business News
      Careers
      Investing
      Management & Marketing
      Shopping
    Comedy
    Education
      Educational Technology
      Higher Education
      K-12
      Language Courses
      Training
    Games & Hobbies
      Automotive
      Aviation
      Hobbies
      Other Games
      Video Games
    Government & Organizations
      Local
      National
      Non-Profit
      Regional
    Health
      Alternative Health
      Fitness & Nutrition
      Self-Help
      Sexuality
    Kids & Family
    Music
    News & Politics
    Religion & Spirituality
      Buddhism
      Christianity
      Hinduism
      Islam
      Judaism
      Other
      Spirituality
    Science & Medicine
      Medicine
      Natural Sciences
      Social Sciences
    Society & Culture
      History
      Personal Journals
      Philosophy
      Places & Travel
    Sports & Recreation
      Amateur
      College & High School
      Outdoor
      Professional
    TV & Film
    Technology
      Gadgets
      Podcasting
      Software How-To
      Tech News
票数 0
EN

Stack Overflow用户

发布于 2014-10-11 11:44:28

在我看来,这个问题是设计不好的json,使用的是体裁id,而不是属性名。json应该是这样的:

代码语言:javascript
复制
{"genre":{"name":"Podcasts","id":"26", ...
    "subgenres":{"genre": {"name":"Arts","id":"1301","url":

而不是:

代码语言:javascript
复制
{"26":{"name":"Podcasts","id":"26", ...
    "subgenres":{"1301":{"name":"Arts","id":"1301","url":

我会将json加载到一个动态对象中:

代码语言:javascript
复制
dynamic genres = new System.Web.Script.Serialization.JavaScriptSerializer().Deserialize<dynamic>(json);

如果需要,可以将动态对象转换为强类型对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26312996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档