L'analyse d'un complexe de résultat JSON avec C#

Je suis en train d'analyser le complexe suivant résultat JSON, qui est retourné par le Zoho Crm API:

{
"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":"[email protected]",
                            "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"
}

}

Ici est de savoir comment mon Objet ressemble:

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; }
}

La "ligne" schéma se répète (no 1, 2, 3 ...) donc ce que je suis, en fait, d'essayer d'obtenir une Liste Générique d'Objets de ce type. Je suis en train de l'aide JSON.NET mais je suis ouvert à d'autres suggestions si elle fait cela plus facile.

Cela ne fonctionne pas dans ce cas, évidemment:

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

Et pas plus que cela:

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

Voici une solution de contournement que j'ai mis ensemble pour analyser cette aide JavaScriptSerializer, mais il est de loin l'un de mes pires des blocs de code à jamais!

            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);
}

Je suis passé par d'autres postes similaires sur StackOverflow et aucun d'entre eux semblent fournir une solution pour ce problème. Quelqu'un aurait-il une solution pour cela? Mon objectif est d'analyser cette réponse JSON dans une façon plus élégante, n'impliquant pas un million de dictionnaire des objets et des ArrayList! Toute aide serait appréciée.

Grâce,
Pete

Mise à jour 7/2/13:

Basé sur Manvik de la suggestion, j'ai mis en place les critères supplémentaires suivants solution:

    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);
}
Quelqu'un aurait-il une solution? Il est resté sans réponse depuis quelques jours maintenant.

OriginalL'auteur DigiOz Multimedia | 2013-06-15