[英]Map Json with dart
我正在嘗試使用dart創建一個簡單的服務器應用程序。 它應該帶有一個ID並打印關聯的名稱。 例如,如果我在瀏覽器中輸入URL“ http:// localhost:4040 /?id = 12 ”,我希望在頁面上打印“ Heroname:Narco”。
這是文件英雄的內容:
{'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時,出現此錯誤消息“ Unsupported request:type'String'is not “地圖”類型的子類型。
我不明白為什么這行不通。 有人可以給我提示嗎?
好吧,我自己解決了。 我改變之后
英雄來
{"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;
}
現在可以使用了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.