J'avais un problème très similaire. Ma demande Json m'était complètement inconnue. Je savais seulement.
Il y aura un identifiant d'objet dedans et quelques paires clés-valeurs ET des tableaux anonymes.
Je l'ai utilisé pour un modèle EAV que j'ai créé:
Ma demande JSON:
{"objectId": 2, "firstName": "Hans", "email" :[ "a@b.de","a@c.de"], "name": "Andre", "something" :["232","123"] }
Ma classe que j'ai définie:
[JsonConverter(typeof(AnonyObjectConverter))]
public class AnonymObject
{
public AnonymObject()
{
fields = new Dictionary();
list = new List();
}
public string objectid { get; set; }
public Dictionary fields { get; set; }
public List list { get; set; }
}
et maintenant que je veux désérialiser des attributs inconnus avec leur valeur et des tableaux à l'intérieur, mon convertisseur ressemble à ceci:
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
AnonymObject anonym = existingValue as AnonymObject ?? new AnonymObject();
bool isList = false;
StringBuilder listValues = new StringBuilder();
while (reader.Read())
{
if (reader.TokenType == JsonToken.EndObject) continue;
if (isList)
{
while (reader.TokenType != JsonToken.EndArray)
{
listValues.Append(reader.Value.ToString() + ", ");
reader.Read();
}
anonym.list.Add(listValues.ToString());
isList = false;
continue;
}
var value = reader.Value.ToString();
switch (value.ToLower())
{
case "objectid":
anonym.objectid = reader.ReadAsString();
break;
default:
string val;
reader.Read();
if(reader.TokenType == JsonToken.StartArray)
{
isList = true;
val = "ValueDummyForEAV";
}
else
{
val = reader.Value.ToString();
}
try
{
anonym.fields.Add(value, val);
}
catch(ArgumentException e)
{
throw new ArgumentException("Multiple Attribute found");
}
break;
}
}
return anonym;
}
Donc maintenant à chaque fois que j'obtiens un AnonymObject, je peux itérer à travers le dictionnaire et à chaque fois qu'il y a mon indicateur "ValueDummyForEAV", je passe à la liste, je lis la première ligne et je divise les valeurs. Ensuite, je supprime la première entrée de la liste et je continue l'itération à partir du dictionnaire.
Peut-être que quelqu'un a le même problème et peut utiliser ceci :)
Cordialement Andre