反序列化嵌套的JSON数组

时间:2016-02-15 12:08:36

标签: c# json

我正在尝试使用.NET DataContractJsonSerializer反序列化以下JSON字符串:

{"region_tag": "eu","services": [{"incidents": [],"status": "online","name": "Client","slug": "client"},{"incidents": [],"status": "online","name": "Game","slug": "game"},{"incidents": [],"status": "online","name": "Store","slug": "store"},{"incidents": [],"status": "online","name": "Website","slug": "web"}],"locales": ["en_GB","de_DE","es_ES","fr_FR","it_IT"],"name": "EU West","hostname": "prod.euw1.lol.riotgames.com","slug": "euw"}

我可以成功反序列化我得到以下字符串(或字符串[])的第一部分:

hostname - returns "prod.euw1.lol.riotgames.com"
name - returns "EU West"
region_tag - returns "eu"
slug - "euw"
locales - "en_GB, de_DE, es_ES, fr_FR, it_IT"

但是我似乎无法反序列化其余部分,因为它们都嵌套在另一个属性中。我该怎么做?

有关完整代码,请参阅this

但是这里的代码如何:

public partial class MainForm : Form
    {
        public MainForm()
        {
            InitializeComponent();
        }

        DataContractJsonSerializer shard;
        MemoryStream shardms;

        void TriggerUpdate(object json)
        {
            try
            {
                ResultListBox.Items.Clear();

                shard = new DataContractJsonSerializer(typeof(ShardStatus));
                shardms = new MemoryStream(Encoding.UTF8.GetBytes(json.ToString()));

                ShardStatusRoot.shardupd = (ShardStatus)shard.ReadObject(shardms);

                #region ShardStatus
                ResultListBox.Items.Add("Hostname: " + ShardStatusRoot.shardupd.hostname);
                foreach (string i in ShardStatusRoot.shardupd.locales)
                {
                    ResultListBox.Items.Add("Locales: " + i);

                }
                ResultListBox.Items.Add("Location: " + ShardStatusRoot.shardupd.name);
                ResultListBox.Items.Add("Region Tag: " + ShardStatusRoot.shardupd.region_tag);
                ResultListBox.Items.Add("Slug: " + ShardStatusRoot.shardupd.slug);
                #endregion
            }
            catch (Exception e)
            {
                MessageBox.Show(e.Message + " => " + e.InnerException);
            }
        }

public class ShardStatusRoot
{
    public static ShardStatus shardupd;
}

[DataContract]
public class ShardStatus
{
    [DataMember]
    public string hostname { get; set; }
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string region_tag { get; set; }
    [DataMember]
    public string slug { get; set; }
    [DataMember]
    public string[] locales { get; set; }
    [DataMember]
    public ShardService shardserv;
}

[DataContract]
public class ShardService
{
    [DataMember]
    public string name { get; set; }
    [DataMember]
    public string slug { get; set; }
    [DataMember]
    public string status { get; set; }
    [DataMember]
    public ShardServiceIncident shardservinc;
}

[DataContract]
public class ShardServiceIncident
{
    [DataMember]
    public bool active { get; set; }
    [DataMember]
    public string created_at { get; set; }
    [DataMember]
    public long id { get; set; }
    [DataMember]
    public ShardServiceIncidentUpdate shardservincupd;
}

[DataContract]
public class ShardServiceIncidentUpdate
{
    [DataMember]
    public string author { get; set; }
    [DataMember]
    public string content { get; set; }
    [DataMember]
    public string created_at { get; set; }
    [DataMember]
    public long id { get; set; }
    [DataMember]
    public string severity { get; set; }
    [DataMember]
    public string updated_at { get; set; }
    [DataMember]
    public ShardServiceIncidentUpdateTranslation shardservincupdtrans;
}

[DataContract]
public class ShardServiceIncidentUpdateTranslation
{
    [DataMember]
    public string content { get; set; }
    [DataMember]
    public string locale { get; set; }
    [DataMember]
    public string updated_at { get; set; }
}

通过组合框中的选择触发TriggerUpdate方法。

1 个答案:

答案 0 :(得分:0)

尝试使用Newtonsoft.Json,它可以帮到你。