Question Déterminer si les résultats Json sont des objets ou des tableaux


J'utilise .net web api pour obtenir json et le retourner à l'avant pour angular. Le json peut être un objet ou un tableau. Mon code ne fonctionne actuellement que pour le tableau et non pour l'objet. J'ai besoin de trouver un moyen de tryparse ou de déterminer si le contenu est un objet ou un tableau.

Voici mon code

    public HttpResponseMessage Get(string id)
    {
        string singleFilePath = String.Format("{0}/../Data/phones/{1}.json", AssemblyDirectory, id);
        List<Phone> phones = new List<Phone>();
        Phone phone = new Phone();
        JsonSerializer serailizer = new JsonSerializer();

        using (StreamReader json = File.OpenText(singleFilePath))
        {
            using (JsonTextReader reader = new JsonTextReader(json))
            {
                //if array do this
                phones = serailizer.Deserialize<List<Phone>>(reader);
                //if object do this
                phone = serailizer.Deserialize<Phone>(reader);
            }
        }

        HttpResponseMessage response = Request.CreateResponse<List<Phone>>(HttpStatusCode.OK, phones);

        return response;
    }

Ce qui précède peut ne pas être la meilleure façon de le faire. C'est juste où je suis maintenant.


32
2017-12-16 20:36


origine


Réponses:


En utilisant Json.NET, vous pourriez faire ceci:

string content = File.ReadAllText(path);
var token = JToken.Parse(content);

if (token is JArray)
{
    IEnumerable<Phone> phones = token.ToObject<List<Phone>>();
}
else if (token is JObject)
{
    Phone phone = token.ToObject<Phone>();
}

78
2017-12-16 20:43



Vous pouvez toujours envelopper votre désérialisation dans un bloc try / catch. Essayez simplement de le désérialiser en tant que tableau dans le bloc try, et il lancera une exception s'il s'agit d'un type d'objet.

try
{
    //if array do this
    phones = serailizer.Deserialize<List<Phone>>(reader);
}
catch //Deserialization of array failed - must be object
{
    //if object do this
    phone = serailizer.Deserialize<Phone>(reader);
}

Je sais que certaines personnes hésiteront à utiliser try / catch comme ça, mais je pense que c'est efficace.


-3
2017-12-16 20:52