用飞镖映射Json

问题描述 投票:0回答:1

我正在尝试用dart制作一个简单的服务器应用程序。它应该带一个id并打印相关名称。例如,如果我在浏览器中输入网址“http://localhost:4040/?id=12”,我希望在页面上打印“Heroname:Narco”。

这是文件heros的内容:

{'id': 11, 'name': 'Mr. Nice'}
{'id': 12, 'name': 'Narco'}
{'id': 13, 'name': 'Bombasto'}
{'id': 14, 'name': 'Celeritas'}
{'id': 15, 'name': 'Magneta'}
{'id': 16, 'name': 'RubberMan'}
{'id': 17, 'name': 'Dynama'}
{'id': 18, 'name': 'Dr IQ'}
{'id': 19, 'name': 'Magma'}
{'id': 20, 'name': 'Tornado'}

hero.dart

class Hero {
  final int id;
  String name;
  Hero(this.id, this.name);

  factory Hero.fromJson(Map<String, dynamic> hero) =>
      Hero(_toInt(hero['id']), hero['name']);

  Map toJson() => {'id': id, 'name': name};

}

int _toInt(id) => id is int ? id : int.parse(id);

hero_dart_service.dart

import 'dart:io';
import 'dart:async';
import 'dart:convert';

import '../angular_tour_of_heroes/lib/src//hero.dart';

String _host = InternetAddress.loopbackIPv4.host;
String path = 'heros';
List<Hero> heros = new List();
var list;

void main() async{
  list = await getData();
  var server = await HttpServer.bind(InternetAddress.loopbackIPv4, 4040);
  print('Listening on localhost:${server.port}');

  await for (var request in server) {
    handleRequest(request);
  }

}

Future<List<String>> getData() async{
  List<String> list = new List();
  Stream lines = new     File(path).openRead().transform(utf8.decoder).transform(const LineSplitter());
  try {
      await for (var line in lines) {
        list.add(line);
      }
  } catch(e) {
      print(e);
      throw new Exception(e);
  }
  return list;
}

void handleRequest(HttpRequest request) {
  try {
    if (request.method == 'GET') {
      handleGet(request);
    } else {
      request.response
        ..statusCode = HttpStatus.METHOD_NOT_ALLOWED
        ..write('Unsupported request: ${request.method}.')
        ..close();
    }
  } catch (e) {
    print('Unsupported request: $e');
  }
}

handleGet(HttpRequest request) {
  heros = list.map((json) => Hero.fromJson(json)).toList();
  final id = request.uri.queryParameters['id'];
  var targetHero = heros.where((hero) => hero.id == id);
  var name = targetHero;//.name;
  final response = request.response;
  response.statusCode = HttpStatus.OK;
  response
    ..write('Heroname: $name')
    ..close();
}

当我启动应用程序时,没有错误,但是当我在浏览器中输入类似“http://localhost:4040/?id=12”的URL时,我收到此错误消息“不支持的请求:类型'字符串'不是”地图“类型的子类型。

我不知道为什么这不起作用。任何人都可以给我一个提示吗?

json dart
1个回答
1
投票

好吧,我自己解决了。我换了之后

大侠来

{"id": 11, "name": "Mr. Nice"}
{"id": 12, "name": "Narco"}
{"id": 13, "name": "Bombasto"}
{"id": 14, "name": "Celeritas"}
{"id": 15, "name": "Magneta"}
{"id": 16, "name": "RubberMan"}
{"id": 17, "name": "Dynama"}
{"id": 18, "name": "Dr IQ"}
{"id": 19, "name": "Magma"}
{"id": 20, "name": "Tornado"}

并且handleGet()来

handleGet(HttpRequest request) {
  heros = list.map((json) => Hero.fromJson(stringToMap(json))).toList();
  final id = request.uri.queryParameters['id'];
  var targetHero = heros.firstWhere((hero) => hero.id.toString() == id);
  var name = targetHero.name;
  final response = request.response;
  response.statusCode = HttpStatus.OK;
  response
    ..write('Heroname: $name')
    ..close();
}

Map<String, dynamic> stringToMap(String s) {
  Map<String, dynamic> map = json.decode(s);
  return map;
}

它现在有效。

© www.soinside.com 2019 - 2024. All rights reserved.