2017-07-10 2 views
0

J'ai 2 classes, LatLong qui contient 2 chaînes, latitude and longitude, et LatLongs qui détient un list<LatLong>.C# JSON ne pas analyser correctement en utilisant Newtownsoft.Json

public class LatLongs 
{ 
    public List<LatLong> latlongs { get; set; } 
} 

public class LatLong 
{ 
    public string latitude { get; set; } 
    public string longitude { get; set; } 
} 

Je suis en train d'utiliser la fonction Newtownsoft.JsonJsonConvert.DeserializeObject pour convertir ma chaîne JSON dans une liste de LatLong. Voici mon JSON

[ 
    { 
     "latitude":"-34.978113", 
     "longitude":"138.516192" 
    }, 
    { 
     "latitude":"-34.978104", 
     "longitude":"138.516648" 
    }, 
    { 
     "latitude":"-34.978384", 
     "longitude":"138.516660" 
    }, 
    { 
     "latitude":"-34.978398", 
     "longitude":"138.516225" 
    } 
] 

Cette JSON est valide et a été vérifié here

Lorsque je tente d'utiliser JsonConvert.DeserializeObject Je reçois une exception

peut désérialiser le tableau JSON en cours (par exemple [ 1,2,3]) dans le type 'SafeAgSystems.Models.LatLongs' car le type nécessite un objet JSON (par exemple {"name": "value"}) pour désérialiser correctement.

Voici le code que je utilise pour tenter de convertir le JSON en une liste de LatLong

List<Locations> coords = await locationTable.Where(u => u.fk_company_id == viewModel.UserData.fk_company_id).ToListAsync(); 
List<LatLongs> latLongs = new List<LatLongs>(); 
for (int i = 0; i < coords.Count(); i++) 
{ 
    LatLongs latlongs = new LatLongs(); 
    latlongs = JsonConvert.DeserializeObject<LatLongs>(coords[i].geofence_coordinates); 
    latLongs.Add(latlongs); 

} 

Une autre chose que j'ai vérifié est que mon List<Locations> coords est en cours de remplissage, ce qui est est sans aucun doute. Je suis complètement coincé, qu'est-ce qui me manque?

Répondre

2

Vous essayez de désérialiser à LatLongs qui a une propriété nommée latlongs de type List<LatLong>. D'un autre côté, vous l'alimentez avec une chaîne contenant List<LatLong> (sans la propriété latlongs).

Vous devez changer votre code pour

List<Locations> coords = await locationTable.Where(u => u.fk_company_id == 
viewModel.UserData.fk_company_id).ToListAsync(); 
List<LatLongs> latLongs = coords.Select(c => new LatLongs 
{ 
    latlongs = JsonConvert.DeserializeObject<List<LatLong>>(c.geofence_coordinates) 
}).ToList(); 
+1

Merci Ivan, vous êtes un magicien! –

0

Je pense que vous n'instanciez pas la propriété list. Essayez le code ci-dessous

List<Locations> coords = await locationTable.Where(u => u.fk_company_id == viewModel.UserData.fk_company_id).ToListAsync(); 
List<LatLongs> latLongs = new List<LatLongs>(); 
for (int i = 0; i < coords.Count(); i++) 
{ 
    LatLongs latlongs = new LatLongs(); 
    latlongs.latlongs = new List<LatLong>(); //Property instantiation 
    latlongs.latlongs= JsonConvert.DeserializeObject<LatLongs>(coords[i].geofence_coordinates).ToList(); 
    latLongs.Add(latlongs); 

} 

Vous pouvez également avoir un constructeur dans la classe pour l'instancier.

+0

Merci Yousuf Je vais vous donner qu'un essai et voir comment je vais –