【问题标题】:Parsing a complex JSON result with C#使用 C# 解析复杂的 JSON 结果
【发布时间】:2013-06-12 03:44:15
【问题描述】:

我正在尝试解析从 Zoho Crm API 返回的以下复杂 JSON 结果:

{
"response":
{
    "result":
    {
        "Contacts":
        {
            "row":
            [
                {
                    "no":"1",
                    "FL":
                    [
                        {
                            "content":"555555000000123456",
                            "val":"CONTACTID"
                        },
                        {
                            "content":"555555000000012345",
                            "val":"SMOWNERID"
                        },
                        {
                            "content":"John Doe",
                            "val":"Contact Owner"
                        },
                        {
                            "content":"Pete",
                            "val":"First Name"
                        },
                        {
                            "content":"Smith",
                            "val":"Last Name"
                        },
                        {
                            "content":"pete@mail.com",
                            "val":"Email"
                        },
                        {
                            "content":"5555551000000012346",
                            "val":"SMCREATORID"
                        },
                        {
                            "content":"Jane Doe",
                            "val":"Created By"
                        },
                        {
                            "content":"555555000000012347",
                            "val":"MODIFIEDBY"
                        },
                        {
                            "content":"Doris Doe",
                            "val":"Modified By"
                        },
                        {
                            "content":"2013-06-14 17:24:10",
                            "val":"Created Time"
                        },
                        {
                            "content":"2013-06-14 17:24:10",
                            "val":"Modified Time"
                        },
                        {
                            "content":"2013-06-14 17:28:05",
                            "val":"Last Activity Time"
                        }
                    ]
                },
                {
                    ...
                }
            ]
        }
    },
    "uri":"/crm/private/json/Contacts/getRecords"
}

}

这是我的对象的外观:

public class Contact
{
    [JsonProperty(PropertyName = "CONTACTID")]
    public string ContactID { get; set; }
    [JsonProperty(PropertyName = "SMOWNERID")]
    public string OwnerID { get; set; }
    [JsonProperty(PropertyName = "Contact Owner")]
    public string ContactOwner { get; set; }
    [JsonProperty(PropertyName = "First Name")]
    public string FirstName { get; set; }
    [JsonProperty(PropertyName = "Last Name")]
    public string LasName { get; set; }
    [JsonProperty(PropertyName = "Email")]
    public string Email { get; set; }
    [JsonProperty(PropertyName = "SMCREATORID")]
    public string CreatorID { get; set; }
    [JsonProperty(PropertyName = "Created By")]
    public string CreatedBy { get; set; }
    [JsonProperty(PropertyName = "MODIFIEDBY")]
    public string ModifiedByID { get; set; }
    [JsonProperty(PropertyName = "Modified By")]
    public string ModifiedBy { get; set; }
    [JsonProperty(PropertyName = "Created Time")]
    public DateTime CreatedTime { get; set; }
    [JsonProperty(PropertyName = "Modified Time")]
    public DateTime ModifiedTime { get; set; }
    [JsonProperty(PropertyName = "Last Activity Time")]
    public DateTime LastActivityTime { get; set; }
}

“行”模式重复(没有 1、2、3 ...)所以我基本上想要得到的是这种类型的对象的通用列表。我正在尝试使用 JSON.NET,但如果它使这更容易,我愿意接受其他建议。

这显然在这种情况下不起作用:

var response = JsonConvert.DeserializeObject<Contact>(jsonString);

这也不是:

var deserializedObjects = JsonConvert.DeserializeObject<List<Contact>>(jsonString);

这是我为使用 JavaScriptSerializer 解析它而整理的一种解决方法,但它是迄今为止我最糟糕的代码块之一!

            List<Contact> loContactList = new List<Contact>();
        Contact loContact = null;

        Dictionary<string, object> dictionary = new JavaScriptSerializer().Deserialize<Dictionary<string, object>>(jsonString);
        var response = (Dictionary<string, object>)dictionary["response"];
        var result = (Dictionary<string, object>)response["result"];
        var contacts = (Dictionary<string, object>)result["Contacts"];
        var row = (ArrayList)contacts["row"];

        foreach (var item in row)
        {
            var loArrayItem = (Dictionary<string, object>)item;
            var fl = (ArrayList)loArrayItem["FL"];

            loContact = new Contact();

            foreach (var contactitem in fl)
            {
                var contactdict = (Dictionary<string, object>)contactitem;
                string val = (string)contactdict["val"];
                string content = (string)contactdict["content"];

                if (val == "CONTACTID")
                {
                    loContact.ContactID = content;
                }
                else if (val == "SMOWNERID")
                {
                    loContact.OwnerID = content;
                }
                else if (val == "Contact Owner")
                {
                    loContact.ContactOwner = content;
                }
                else if (val == "First Name")
                {
                    loContact.FirstName = content;
                }
                else if (val == "Last Name")
                {
                    loContact.LastName = content;
                }
                else if (val == "Email")
                {
                    loContact.Email = content;
                }
                else if (val == "SMCREATORID")
                {
                    loContact.CreatorID = content;
                }
                else if (val == "Created By")
                {
                    loContact.CreatedBy = content;
                }
                else if (val == "MODIFIEDBY")
                {
                    loContact.ModifiedByID = content;
                }
                else if (val == "Modified By")
                {
                    loContact.ModifiedBy = content;
                }
                else if (val == "Created Time")
                {
                    loContact.CreatedTime = Convert.ToDateTime(content);
                }
                else if (val == "Modified Time")
                {
                    loContact.ModifiedTime = Convert.ToDateTime(content);
                }
                else if (val == "Last Activity Time")
                {
                    loContact.LastActivityTime = Convert.ToDateTime(content);
                }
            }

            loContactList.Add(loContact);
        }

我在 StackOverflow 上浏览过其他类似的帖子,但似乎没有一个为这个问题提供解决方案。有人对此有解决方案吗?我的目标是以更优雅的方式解析这个 JSON 响应,它不涉及一百万个字典对象和 ArrayList!任何帮助将不胜感激。

谢谢, 皮特

2013 年 7 月 2 日更新:

根据 Manvik 的建议,我整理了以下附加解决方案:

    public class ResponseActual
{

    [JsonProperty("response")]
    public Response2 Response { get; set; }
}

public class Response2
{

    [JsonProperty("result")]
    public Result Result { get; set; }

    [JsonProperty("uri")]
    public string Uri { get; set; }
}

public class Result
{

    [JsonProperty("Contacts")]
    public Contacts Contacts { get; set; }
}

public class Contacts
{

    [JsonProperty("row")]
    public IList<Row> Row { get; set; }
}

public class Row
{

    [JsonProperty("no")]
    public string No { get; set; }

    [JsonProperty("FL")]
    public IList<FL> FL { get; set; }
}

public class FL
{

    [JsonProperty("content")]
    public string Content { get; set; }

    [JsonProperty("val")]
    public string Val { get; set; }
}

List<Contact> loContactList = new List<Contact>();
Contact loContact = null;

ResponseActual respone = JsonConvert.DeserializeObject<ResponseActual>(jsonString);

foreach (var row in respone.Response.Result.Contacts.Row)
{
    loContact = new Contact();

    var rowItem = row.FL.ToList();

    try { loContact.ContactID = rowItem.Where<FL>((s, t) => s.Val == "CONTACTID").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.OwnerID = rowItem.Where<FL>((s, t) => s.Val == "SMOWNERID").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.ContactOwner = rowItem.Where<FL>((s, t) => s.Val == "Contact Owner").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.FirstName = rowItem.Where<FL>((s, t) => s.Val == "First Name").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.LastName = rowItem.Where<FL>((s, t) => s.Val == "Last Name").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.Email = rowItem.Where<FL>((s, t) => s.Val == "Email").Select(x => x.Content).Single(); } catch { }
    try { loContact.CreatorID = rowItem.Where<FL>((s, t) => s.Val == "SMCREATORID").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.CreatedBy = rowItem.Where<FL>((s, t) => s.Val == "Created By").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.ModifiedByID = rowItem.Where<FL>((s, t) => s.Val == "MODIFIEDBY").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.ModifiedBy = rowItem.Where<FL>((s, t) => s.Val == "Modified By").Select(x => x.Content).Single(); }
    catch { }
    try { loContact.CreatedTime = Convert.ToDateTime(rowItem.Where<FL>((s, t) => s.Val == "Created Time").Select(x => x.Content).Single()); }
    catch { }
    try { loContact.ModifiedTime = Convert.ToDateTime(rowItem.Where<FL>((s, t) => s.Val == "Modified Time").Select(x => x.Content).Single()); }
    catch { }
    try { loContact.LastActivityTime = Convert.ToDateTime(rowItem.Where<FL>((s, t) => s.Val == "Last Activity Time").Select(x => x.Content).Single()); }
    catch { }

    loContactList.Add(loContact);
}

【问题讨论】:

  • 有人对此有答案吗?这几天一直无人接听。

标签: c# .net json serialization zoho


【解决方案1】:
you can use this code:

    dynamic dictionary = (JsonConvert.DeserializeObject>(jsonstring))["response"];


            var result = dictionary.result;
            var contact= result.Contacts;
            var row= contact.row;

            foreach (var item in row)
            {

                var no= item.no;

            }

【讨论】:

    【解决方案2】:

    我能问你一件事吗?你是导出 JSON 的人吗?我问这个是因为格式很奇怪,而且确实妨碍了您的代码。

    更简单的格式可以让您以几乎直接的方式序列化字符串。

    【讨论】:

    • 不!你不会发现我像这样导出 JSON 死了!功劳完全归功于 zoho.com 的天才们。
    【解决方案3】:

    使用以下类使用 JSON.Net 进行反序列化

    public class ResponseActual
    {
    
        [JsonProperty("response")]
        public Response2 Response { get; set; }
    }
    
    public class Response2
    {
    
        [JsonProperty("result")]
        public Result Result { get; set; }
    
        [JsonProperty("uri")]
        public string Uri { get; set; }
    }
    
    public class Result
    {
    
        [JsonProperty("Contacts")]
        public Contacts Contacts { get; set; }
    }
    
    public class Contacts
    {
    
        [JsonProperty("row")]
        public IList<Row> Row { get; set; }
    }
    
      public class Row
    {
    
        [JsonProperty("no")]
        public string No { get; set; }
    
        [JsonProperty("FL")]
        public IList<FL> FL { get; set; }
    }
    
     public class FL
    {
    
        [JsonProperty("content")]
        public string Content { get; set; }
    
        [JsonProperty("val")]
        public string Val { get; set; }
    }
    
    //To De-serialize
    ResponseActual respone = JsonConvert.DeserializeObject<ResponseActual>(jSON_sTRING)
    
    //Get the contacts list
    List<FL> contacts = respone.Response.Result.Contacts.Row[0].FL.ToList();
    
    //Now Get the required value using LINQ
    var value = contacts.Where<FL>((s, e) => s.Val =="Email").Select(x=>x.Content).Single();
    

    你也可以看看这个—— Deserializing JSON to .NET object using Newtonsoft (or LINQ to JSON maybe?)

    【讨论】:

    • 谢谢曼维克!诚然,我一直在寻找更自动化的东西,但这个解决方案肯定比拥有所有嵌套字典更好。
    【解决方案4】:

    您需要在反序列化对象类型中包含以下 JSON 部分:

    {
    "response":
    {
        "result":
        {
            "Contacts":
            {
                "row":
                [
                    {
                        "no":"1",
                        "FL":
    

    类类型:'Contact' 不合适。

    【讨论】:

    • 感谢您的提示。我的问题是我该怎么做?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多