6
votes

Analyse des valeurs doubles de JSON dans Flutter et Dart

J'ai des problèmes lorsque j'essaie d'obtenir des valeurs doubles de JSON dans Flutter.

{ 
   point: {
     title: "Point title",
     lat: 42.123456,
     lng: 32.26567
  }
}

Pour une raison quelconque, j'ai eu une erreur

Erreur Dart: exception non gérée: le type 'double' n'est pas un sous-type de tapez 'String'

J'ai essayé d'utiliser double.parse (json ["lng"]) à la place, mais j'ai eu la même erreur.
En même temps, cette façon d'obtenir des données à partir de JSON fonctionne bien avec d'autres types.

Ceci est un exemple JSON

class MapPoint {
  String title;
  double lat;
  double lng;

  MapPoint({this.title, this.lat, this.lng});

  factory MapPoint.fromJson(Map<String, dynamic> json) {
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] as double,
        lng: json["lng"] as double
    );
  }
}


7 commentaires

Quel JSON provoque cette erreur? Si vos valeurs sont placées entre guillemets, elles ne seront pas interprétées comme des doubles.


JSON est bien parce que je peux obtenir toutes les autres valeurs (chaîne et int) de celui-ci


Soit le JSON ne correspond pas à votre code, soit votre code ne correspond pas à votre JSON. Sans fournir le JSON à l'origine de l'erreur, vous pouvez également supprimer la question, car elle ne fournit tout simplement pas les informations requises pour diagnostiquer le problème.


J'ai ajouté un exemple de JSON. Une chose qui peut être inhabituelle est que les valeurs doubles ne sont pas présentées sous forme de chaînes.


Ce n'est pas du JSON valide. Dans JSON, les clés doivent être entre guillemets et un , manque après "Point title" . Les valeurs doubles ne sont jamais représentées en tant que String dans JSON.


, a été manqué dans l'exemple, désolé. Ce que j'entends par double comme String dans JSON - peut être vu jsonplaceholder.typicode.com/ utilisateurs où les positions géographiques se trouvent dans les qoutes


Les guillemets autour des clés sont toujours manquants.


3 Réponses :


1
votes

Je ne peux pas reproduire

void main() {
  final json = {
    "point": {"title": "Point title", "lat": 42.123456, "lng": 32.26567}
  };
  final p = MapPoint.fromJson(json);
  print(p);
}

class MapPoint {
  String title;
  double lat;
  double lng;

  MapPoint({this.title, this.lat, this.lng});

  factory MapPoint.fromJson(Map<String, dynamic> json) {
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] as double,
        lng: json["lng"] as double);
  }
}


0 commentaires

13
votes

L'analyseur JSON de Dart convertit la propriété dans json et est apparemment assez intelligent pour cracher un double type.

someVariable as double attend une chaîne sur le côté gauche.

Ce qui se passe probablement, c'est que vous essayez de convertir un double en un double.

J'essaierais quelque chose comme ceci:

lat: json["lat"].toDouble(),

Cela couvrirait le cas des données dans votre JSON est comme "5". Dans ce cas, le convertisseur dart json convertirait le type en int et casserait votre code si vous attendez toujours un double.


2 commentaires

lat: double.parse (json ["lat"])


Si vous ne savez pas si le type est int ou double; mieux vaut le déclarer comme num



2
votes

J'avais le même problème, comme je le pense:

class MapPoint {
  String title;
  double lat;
  double lng;

  MapPoint({this.title, this.lat, this.lng});

  factory MapPoint.fromJson(Map<String, dynamic> json) {
    return MapPoint(
        title: json["title"] as String,
        lat: json["lat"] is int ? (json['lat'] as int).toDouble() : json['lat'],
        lng: json["lng"] is int ? (json['lng'] as int).toDouble() : json['lng']
    );
  }
}


0 commentaires