2017-05-16 4 views
2

J'essaie de désérialiser un tableau à l'aide Newtonsoft donc je peux afficher des fichiers à partir d'un serveur à base de nuage dans une zone de liste, mais je finis toujours obtenir cette erreur, peu importe ce que je cherche:C# Newtonsoft désérialiser tableau JSON

Newtonsoft.Json.JsonReaderException: 'Caractère inattendu rencontré lors de l'analyse syntaxique: [. Chemin '[0] .priv', ligne 4, position 15. '

Thisis exemple essayer de désérialiser:

[ 
{ 
    "code": 200, 
    "priv": [ 
    { 
     "file": "file.txt", 
     "ext": "txt", 
     "size": "104.86" 
    }, 
    { 
     "file": "file2.exe", 
     "ext": "exe", 
     "size": "173.74" 
    }, 

    ], 
    "pub": [ 
    { 
     "file": "file.txt", 
     "ext": "txt", 
     "size": "104.86" 
    }, 
    { 
     "file": "file2.exe", 
     "ext": "exe", 
     "size": "173.74" 
    } 
    ] 
} 
] 

J'ai essayé en utilisant une classe C# comme ceci:

public class ListJson 
{ 
    [JsonProperty("pub")] 
    public List List { get; set; } 
} 

public class List 
{ 
    [JsonProperty("file")] 
    public string File { get; set; } 

    [JsonProperty("ext")] 
    public string Ext { get; set; } 

    [JsonProperty("size")] 
    public string Size { get; set; } 
} 
    [JsonProperty("priv")] 
public List List { get; set; } 
} 

public class List 
{ 
    [JsonProperty("file")] 
    public string File { get; set; } 

    [JsonProperty("ext")] 
    public string Ext { get; set; } 

    [JsonProperty("size")] 
    public string Size { get; set; } 
} 

Et désérialiser avec:

List<list> fetch = Newtonsoft.Json.JsonConvert.DeserializeObject<List<list>>(json); 
+0

Avez-vous utilisé ceci pour valider votre [JSON] (http://json.parser.online.fr/) * indice * il a une erreur de syntaxe – t0mm13b

+0

Ce n'est pas mon json je l'ai eu de l'API du serveur donc rien de plus que je peux faire à cela:/je vais dire au propriétaire du site – Zeq

+2

vous avez 2 classes appelées 'List' ...? –

Répondre

4

La structure de bonne classe C# pour votre JSON est la suivante:

public class FileEntry 
{ 
    public string file { get; set; } 
    public string ext { get; set; } 
    public string size { get; set; } 
} 

public class FileList 
{ 
    public int code { get; set; } 
    public List<FileEntry> priv { get; set; } 
    public List<FileEntry> pub { get; set; } 
} 

désérialisation de cette manière:

var fetch = JsonConvert.DeserializeObject<FileList[]>(json); 
var fileList = fetch.First(); // here we have a single FileList object 

Comme l'a dit dans l'autre réponse, la création d'une classe appelée List n » t le transformer automagiquement en une collection d'objets. Vous devez déclarer les types à désérialiser d'un tableau un type de collection (par exemple List<T>, T[], etc.).

Petite astuce: en cas de doute, utilisez json2csharp.com pour générer des classes fortement typées à partir d'une chaîne json.

+0

Merci beaucoup! cela a fonctionné – Zeq

+0

Maintenant, je suis bloqué en utilisant effectivement le json désérialisé:/je vraiment sucer à ce – Zeq

+0

@ Zéq coincé où? Ici, c'est une petite [démo sur .NET Fiddle] (https://dotnetfiddle.net/ZEqKlT). –

0

Au moment List a un seul List instance appelée priv, qui, malgré le nom: ne fait pas une liste. Pour désérialiser un tableau JSON ("priv": [...]), il doit être de type tableau ou liste, par exemple List<T> pour certains T. Vraisemblablement un List<FileThing>, si nous supposons que FileThing est réellement le deuxième type appelé List (vous avez 2).

+0

Ma classe est appelée liste – Zeq

+0

@Zeq ils ne sont pas ** tous les deux ** appelés 'List' (au moins: pas dans le même espace de noms) ... car * ce n'est pas légal C# * ... mais c'est isn 't le point. Le problème n'est pas le nom ... c'est qu'il doit être un tableau ou un type de liste. Vous pourriez renommer votre (s) type (s) 'List' en' Banana', et tout ce que j'ai dit resterait identique. –