如何将Yaml文件加载到Dart中的Map?

时间:2014-04-17 21:19:31

标签: file dart yaml

我知道来自Pub的Yaml库,它可以通过loadYaml()函数加载和解析Yaml字符串。但我不知道,如何加载Yaml文件的内容作为此函数的参数。

我的代码(无效):

data.yaml

name1: thing1
name2: thing2

process.dart

import 'dart:html';
import 'package:yaml/yaml.dart';

main(){
String path = 'data.yaml';
return HttpRequest.getString(path)
    .then((String yamlString){
        YamlMap map = loadYaml(yamlString);
        String name = map['name1'];
        print(name);
    });    
}

2 个答案:

答案 0 :(得分:2)

查看loadYamlyaml.dart的来源。 如果你使用eclipse或DartEditor,你也可以将鼠标悬停在loadYaml上以获得描述。 它说如果函数返回一个地图,那就是YamlMap,而不是普通的Dart地图。它也可能返回其他内容,例如StringnumList。 你为什么不做print(map)print(map.runtimeType)

答案 1 :(得分:0)

我认为为了不漏水,下面的代码需要做更多的工作,但这适用于我的基本目的,我从 JSON 转换到 YAML 并希望保留我的代码库的其余部分几乎不变。

>
import 'package:yaml/yaml.dart';

extension YamlMapConverter on YamlMap {
  dynamic _convertNode(dynamic v) {
    if (v is YamlMap) {
      return (v as YamlMap).toMap();
    }
    else if (v is YamlList) {
      var list = <dynamic>[];
      v.forEach((e) { list.add(_convertNode(e)); });
      return list;
    }
    else {
      return v;
    }
  }

  Map<String, dynamic> toMap() {
    var map = <String, dynamic>{};
    this.nodes.forEach((k, v) {
      map[(k as YamlScalar).value.toString()] = _convertNode(v.value);
    });
    return map;
  }
}

...
var yamlData = loadYaml(yaml);
Map<String, dynamic> dartMap = yamlMap.toMap();
...

要变得无懈可击,它需要更好地处理异常并处理诸如 YAML 标签之类的项目。我不需要这些,所以我没有进一步开发它。

代码基于 Dart-YAML 版本 ^3.1.0