JSON читатель ожидал имя, но было строкой - PullRequest
0 голосов
/ 05 марта 2020

My JSON:

{
        "type": "Point",
        "coordinates": [
          [
            16.990586757110702,
            52.336268037215298
          ]
        ]
 },

Мой код:


    private double[] readGeometry(JsonReader reader) throws IOException{
        double coordinates[] = new double[2];
        reader.beginObject();
        while (reader.hasNext()){
            String name = reader.nextName() ;
            if (name == "coordinates"){
                reader.beginArray();
                reader.beginArray();
                coordinates[0] = reader.nextDouble();
                coordinates[1] = reader.nextDouble();
                reader.endArray();
                reader.endArray();
            }
        }
        reader.endObject();
        return coordinates;
    }

type правильно читает. На coordinates я получаю expected Name but was String error. Когда я повторил его вручную, метод reader.nextString() не работал. Что происходит?

ОБНОВЛЕНИЕ ОБНОВЛЕНО: мне нужно обработать каждую часть JSON, вот правильный рабочий код:

double coordinates[] = new double[2];
        reader.beginObject();
        while (reader.hasNext()){
            String name = reader.nextName();
            if (name.equals("coordinates")){
                reader.beginArray();
                reader.beginArray();
                coordinates[0] = reader.nextDouble();
                coordinates[1] = reader.nextDouble();
                reader.endArray();
                reader.endArray();
            }
            else if (name.equals("type")){
                reader.nextString();
            }
        }
        reader.endObject();
        return coordinates;

1 Ответ

0 голосов
/ 05 марта 2020

Просто проверьте, работает ли это для вас.

Ниже ваш json, который я проанализировал локально:

{
    "type": "Point",
    "coordinates": [
      [
        16.990586757110702,
        52.336268037215298
      ]
    ]
}

это класс модели, который я создал на основе вас json.

// To parse this JSON data, do
//
//     final point = pointFromJson(jsonString);

import 'dart:convert';

Point pointFromJson(String str) => Point.fromJson(json.decode(str));

String pointToJson(Point data) => json.encode(data.toJson());

class Point {
    String type;
    List<List<double>> coordinates;

    Point({
        this.type,
        this.coordinates,
    });

    factory Point.fromJson(Map<String, dynamic> json) => Point(
        type: json["type"],
        coordinates: List<List<double>>.from(json["coordinates"].map((x) => List<double>.from(x.map((x) => x.toDouble())))),
    );

    Map<String, dynamic> toJson() => {
        "type": type,
        "coordinates": List<dynamic>.from(coordinates.map((x) => List<dynamic>.from(x.map((x) => x)))),
    };
}

позже я проанализировал json и добавил их в список:

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:sample_project_for_api/model.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      title: 'Flutter Demo',
      home: MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  Point yourpoint = new Point();
  bool _isLoading = false;

  List<double> coordinates = List();

  @override
  void initState() {
    super.initState();
    yourMethod();
  }

  yourMethod() async {
    String jsonString = await loadFromAssets();

    final point = pointFromJson(jsonString);
    yourpoint = point;

    for (int i = 0; i < yourpoint.coordinates.length; i++) {
      for (int j = 0; j < yourpoint.coordinates[i].length; j++) {
        print(yourpoint.coordinates[i][j]);
        coordinates.add(yourpoint.coordinates[i][j]);
      }
    }

    for(int i=0;i<coordinates.length;i++)
    {
      print('Your cordinates are $i :${coordinates[i]}');
    }


  }

  Future<String> loadFromAssets() async {
    return await rootBundle.loadString('json/parse.json');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('title'),
      ),
      body: Text('sample'),
    );
  }
}

, дайте мне знать, если это работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...