2012-12-11 3 views
1

En raison de circonstances indépendantes de ma volonté (l'API SurveyGizmo), je dois les données désérialiser détenues dans le format suivant (échantillon):désérialisation mauvaise structure de données avec JSON.NET

// Data in JSON format as produced by API 
[{ 
    "id": "2", 
    "contact_id": "", 
    "status": "Deleted", 
    "is_test_data": "1", 
    "datesubmitted": "2012-11-12 08:41:49", 
    "sResponseComment": "", 
    "[question(3)]": "fsdfsd", 
    "[question(4), option(10001)]": "", 
    "[question(4), option(10002)]": "Some answer", 
    "[question(5), option(10008)]": "", 
    "[question(5), option(10009)]": "Other administrative role" 
},{ 
    etc. 
}] 

J'utilise JSON.Net à décodez-le et, idéalement, insérez ces entrées dans une structure à clé: question [qnum] [optnum]. Je travaille très bien avec les tableaux multidimensionnels et j'utilise RegEx pour séparer les questions et les options selon les besoins, mais je ne trouve pas d'exemples de travail suffisants pour commencer à écrire un JSONConverter personnalisé pour contenir le code.

Jusqu'à présent, j'ai trouvé les éléments suivants (ISurveyObject types que je limite vais désérialisation, et précise certaines propriétés communes)

class SurveyGizmoJsonArrayConverter<T> : Newtonsoft.Json.Converters.CustomCreationConverter<T[]> where T : ISurveyObject 
{ 
    public override T[] Create(Type objectType) 
    { 
     List<T> retArr = new List<T>(); 
     return retArr.ToArray(); 
    } 

    public override object ReadJson(Newtonsoft.Json.JsonReader reader, Type objectType, object existingValue, Newtonsoft.Json.JsonSerializer serializer) 
    { 
     // What goes here? I can't seem to find working examples... 
    } 
} 

Quelqu'un peut-il offrir des échantillons d'aide ou code s'il vous plaît?

Je suppose que peut-être l'extrait de code plus utile serait ce que je besoin de mettre dans la fonction ReadJson pour lui faire faire désérialisation plain vanilla - Je peux alors modifier que pour les cas particuliers ...

+1

Vous pourriez trouver ce poste utile: http://stackoverflow.com/questions/8252176/json-net-deserializeobject-format – ADH

Répondre

1

Cette fonctionne pour moi

var listofDicts = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(json); 
+0

cela ne répond pas vraiment à la question: la le point est que la structure JSON est mauvaise, donc en utilisant votre code, j'obtiens un 'List' de' Dictionary 'où les clés sont des chaînes comme' [question (4), option (10053)], 'et' [question (4), option (10054)], '. Le point d'un désérialiseur personnalisé serait d'obtenir une 'Liste' de' Dictionary 'où certains des objets sont eux-mêmes des structures multidimensionnelles. Quelque chose comme: 'dict {[somekey] => 'somevalue', [question] => {[4] => {[10053] => 'ans1', [10054] => 'ans2'}}}' (désolé, le formatage du code ne fonctionne pas dans les commentaires) – almcnicoll

Questions connexes