web-dev-qa-db-fra.com

Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3])

J'essaie de lire mon résultat JSON.

Voici mon RootObject

public class RootObject
{
public int id { get; set; }
public bool is_default { get; set; }
public string name { get; set; }
public int quantity { get; set; }
public string stock { get; set; }
public string unit_cost { get; set; }
}

Voici mon résultat JSON

[{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id": 4592, "is_default": false, "name": "Bundle", "quantity": 5, "stock": "100000.00", "unit_cost": "0"}]

Voici mon code pour lire le résultat

     public static RootObject GetItems(string user, string key, Int32 tid, Int32 pid)
    {
        // Customize URL according to geo location parameters
        var url = string.Format(uniqueItemUrl, user, key, tid, pid);

        // Syncronious Consumption
        var syncClient = new WebClient();

        var content = syncClient.DownloadString(url);

        return JsonConvert.DeserializeObject<RootObject>(content);

    }

Mais j'ai un problème avec cette erreur:

Impossible de désérialiser le tableau JSON actuel (par exemple [1,2,3]) dans le type 'avaris_cash_salepoint.BL.UniqueItemDataRootObject' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement. Pour corriger cette erreur, changez le JSON en un objet JSON (par exemple {"nom": "valeur"}) ou changez le type désérialisé en un tableau ou un type qui implémente une interface de collection (par exemple ICollection, IList) comme List qui peut être désérialisé à partir d'un tableau JSON. JsonArrayAttribute peut également être ajouté au type pour le forcer à se désérialiser à partir d'un tableau JSON. Chemin '', ligne 1, position 1.

sur cette ligne: return JsonConvert.DeserializeObject (content);

Une aide pour corriger cette erreur?

12
Djama

Je pense que le problème que vous rencontrez est que votre JSON est une liste d'objets lorsqu'il arrive et qu'il ne se rapporte pas directement à votre classe racine.

var content ressemblerait à quelque chose comme ça (je suppose):

[
  {
    "id": 3636,
    "is_default": true,
    "name": "Unit",
    "quantity": 1,
    "stock": "100000.00",
    "unit_cost": "0"
  },
  {
    "id": 4592,
    "is_default": false,
    "name": "Bundle",
    "quantity": 5,
    "stock": "100000.00",
    "unit_cost": "0"
  }
]

Remarque: utilisez http://jsonviewer.stack.hu/ pour formater votre JSON.

Donc, si vous essayez ce qui suit, cela devrait fonctionner:

  public static List<RootObject> GetItems(string user, string key, Int32 tid, Int32 pid)
    {
        // Customize URL according to geo location parameters
        var url = string.Format(uniqueItemUrl, user, key, tid, pid);

        // Syncronious Consumption
        var syncClient = new WebClient();

        var content = syncClient.DownloadString(url);

        return JsonConvert.DeserializeObject<List<RootObject>>(content);

    }

Vous devrez ensuite itérer si vous ne souhaitez pas renvoyer une liste de RootObject.


Je suis allé de l'avant et j'ai testé cela dans une application console, j'ai bien fonctionné.

enter image description here

23
Dayan

C'est parce que le json que vous obtenez est un tableau de votre classe RootObject, plutôt qu'une seule instance, changez votre DeserialiseObject<RootObject> être quelque chose comme DeserialiseObject<RootObject[]> (non testé).

Vous devrez ensuite modifier votre méthode pour renvoyer une collection de RootObject ou effectuer un traitement supplémentaire sur l'objet désérialisé pour renvoyer une seule instance.

Si vous regardez une version formatée de la réponse que vous avez fournie:

[
   {
      "id":3636,
      "is_default":true,
      "name":"Unit",
      "quantity":1,
      "stock":"100000.00",
      "unit_cost":"0"
   },
   {
      "id":4592,
      "is_default":false,
      "name":"Bundle",
      "quantity":5,
      "stock":"100000.00",
      "unit_cost":"0"
   }
]

Vous pouvez voir deux instances là-dedans.

4
Psytronic

Vous pouvez l'utiliser pour résoudre votre problème:

private async void btn_Go_Click(object sender, RoutedEventArgs e)
{
    HttpClient webClient = new HttpClient();
    Uri uri = new Uri("http://www.school-link.net/webservice/get_student/?id=" + txtVCode.Text);
    HttpResponseMessage response = await webClient.GetAsync(uri);
    var jsonString = await response.Content.ReadAsStringAsync();
    var _Data = JsonConvert.DeserializeObject <List<Student>>(jsonString);
    foreach (Student Student in _Data)
    {
        tb1.Text = Student.student_name;
    }
}
3
user3744755

Vous avez un tableau, convertissez-le en objet, quelque chose comme:

données: [{"id": 3636, "is_default": true, "name": "Unit", "quantity": 1, "stock": "100000.00", "unit_cost": "0"}, {"id ": 4592," is_default ": false," nom ":" Bundle "," quantité ": 5," stock ":" 100000.00 "," unit_cost ":" 0 "}]

1
BlackTigerX

Pour lire plus d'une astuce json (tableau, attribut), j'ai fait ce qui suit.


var jVariable = JsonConvert.DeserializeObject<YourCommentaryClass>(jsonVariableContent);

changer pour

var jVariable = JsonConvert.DeserializeObject <List<YourCommentaryClass>>(jsonVariableContent);

Parce que vous ne pouvez pas voir tous les bits de la méthode utilisée dans la boucle foreach. Exemple pour chaque boucle

foreach (jsonDonanimSimple Variable in jVariable)
                {    
                    debugOutput(jVariable.Id.ToString());
                    debugOutput(jVariable.Header.ToString());
                    debugOutput(jVariable.Content.ToString());
                }

J'ai également reçu une erreur dans cette boucle et l'ai modifiée comme suit.

foreach (jsonDonanimSimple Variable in jVariable)
                    {    
                        debugOutput(Variable.Id.ToString());
                        debugOutput(Variable.Header.ToString());
                        debugOutput(Variable.Content.ToString());
                    }
0
cihatpala

Ce pourrait être vous

Avant d'essayer de consommer votre objet json avec un autre objet, vérifiez simplement que l'api renvoie du json brut via le navigateur api/rootobject, pour mon cas, j'ai découvert que le fournisseur de données sous-jacent mssqlserver n'était pas en cours d'exécution et lève une exception non levée!

aussi simple que cela :)

0
Albert Takaruza