2017-02-27 5 views
2

Je crée un Windows Phone Silver Light 8 app.Newsoft Json désérialiser en produits Collection ne fonctionne pas

J'ai une chaîne JSON et j'essaie de la convertir en une liste d'objets et chaque objet est un objet d'une classe "Produit" et la liste est censée être des produits. finalement je veux le convertir en collection Observable afin que je puisse lier cette collection à ma liste dans mon application de téléphone Windows Silverlight.

Voici ma classe

public class Product 
{ 
    public string _id { get; set; } 
    public string code { get; set; } 
    public string name { get; set; } 
    public string imgAddress { get; set; } 
    public int queryCount { get; set; } 
} 

Voici le code désérialiser le JSON

var PDS = "{\"products\":[{\"_id\":\"58b2\",\"code\":\"59034\",\"name\":\"somename1\",\"imgAddress\":\"https://someimageurl/.../.jpg\",\"queryCount\":0},{\"_id\":\"58b3\",\"code\":\"59035\",\"name\":\"somename2\",\"imgAddress\":\"https://someimageurl2/.../.jpg\",\"queryCount\":1}]}"; 
var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

Voici ma collection pour la liaison

public ObservableCollection<Product> Products { get; set; } 

ERREURS >> D'abord, je devenais erreur d'analyse alors je me suis évadé toutes les citations dans la chaîne comme celui-ci \ » ** >> ** Mais il convertissait seulement une chaîne normale comme objet, mais Je veux convertir à une collection de produits de type « produit »

>> Exception

informations complémentaires: ne peut pas désérialiser l'objet JSON en cours (par exemple {"name": "value"}) dans le type "System.Collections.Generic.List`1 [PivotApp1.Product]" car le type requiert un tableau JSON (par exemple [1,2,3]) pour désérialiser correctement. Pour corriger cette erreur, changez le JSON en un tableau JSON (par exemple [1,2,3]) ou changez le type désérialisé pour qu'il soit un type .NET normal (par exemple, pas un type primitif comme un entier, pas un type de collection) comme un tableau ou une liste) qui peut être désérialisé à partir d'un objet JSON. JsonObjectAttribute peut également être ajouté au type pour le forcer à désérialiser à partir d'un objet JSON.

Path 'produits', ligne 1, position 12.

Merci à l'avance

+1

Le code que vous avez fourni ne serait même pas compilé. S'il vous plaît fournir un [mcve]. –

Répondre

1

Vous pouvez désérialiser cette façon (mais vous aurez en quelque sorte reformater votre chaîne JSON):

de

var PDS = "{"products":[{"_id":"58b2","code":"59034","name":"somename1","imgAddress":"https://someimageurl/.../.jpg","queryCount":0},{"_id":"58b3","code":"59035","name":"somename2","imgAddress":"https://someimageurl2/.../.jpg","queryCount":1}]}"; 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

à

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 
//PDS is actually very long string and the array products has a lot of objects but I am only writing 2 products here for simplicity. 

Puis

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 

Plus d'infos ->Deserialize a collection

Pas besoin de créer une autre classe comme le suggère!

EDIT: En fait, vous obtenez cette exception car votre chaîne JSON représente un objet 'products' contenant une liste de 'Product' et cela ne se rapporte pas directement à votre classe racine.

Voici ce look actuel de votre JSON comme:

Your current JSON string

Votre résultat de chaîne JSON doit être quelque chose comme ça à la place:

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 

représentée comme suit (remarquez la légère différence):

Correct JSON string for List<Product> type

En utilisant cette chaîne JSON, il ne fonctionnera sans exception soulevée:

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 

Ou, si vous ne pouvez pas changer la chaîne JSON entraînant PDS, vous pouvez faire ce que le juge a suggéré Tuc (via un nouveau " RootClass ").

+0

J'ai déjà essayé cette méthode et il me donne une exception, s'il vous plaît voir le post maintenant, je viens de le mettre à jour avec l'exception. – touseef

+0

S'il vous plaît voir mes modifications Je viens de mettre à jour. –

+0

oui ça marche merci beaucoup :) – touseef

2

votre chaîne JSON a dû être modifié pour obtenir le code pour compiler:

var PDS = "{'products':[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]}"; 

Vous avez besoin d'un autre objet avec une collection de produits comme propriété des produits appelés à Afin de désérialiser votre JSON

Ceci peut ne pas être la meilleure solution mais cela fonctionne:

Créer une autre classe:

public class RootObject 
{ 
    public List<Product> products; 
} 

utiliser ce code pour désérialiser votre JSON:

var pds = JsonConvert.DeserializeObject(PDS, typeof(RootObject)); 

si vous êtes dans le contrôle de votre chaîne JSON vous pouvez envisager de modifier à cette (enlever la propriété « produits » et de se retrouver avec seulement une gamme de produits dans la chaîne JSON):

var PDS = "[{'_id':'58b2','code':'59034','name':'somename1','imgAddress':'https://someimageurl/.../.jpg','queryCount':0},{'_id':'58b3','code':'59035','name':'somename2','imgAddress':'https://someimageurl2/.../.jpg','queryCount':1}]"; 

alors vous pourriez être en mesure d'utiliser la solution proposée par (la désérialisation Tait directement à une liste de produits):

var pds = JsonConvert.DeserializeObject<List<Product>>(PDS); 
+0

ça marche mais oui vous avez raison ce n'est pas la meilleure solution c'est lent. merci beaucoup de toute façon :) – touseef