gpt4 book ai didi

c# - 使用 C# 解析复杂的 JSON 结果

转载 作者:行者123 更新时间:2023-11-30 17:04:48 25 4
gpt4 key购买 nike

我正在尝试解析从 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);
}

最佳答案

使用以下类使用 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?)

关于c# - 使用 C# 解析复杂的 JSON 结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17126323/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com