yaml safe_load许多不同的对象

时间:2016-02-23 12:53:01

标签: deserialization yaml pyyaml

我有一个巨大的YAML文件,其中包含此代码段中的标记定义

- !!python/object:manufacturer.Manufacturer
  name: aaaa
  address: !!python/object:address.BusinessAddress {street: bbbb, number: 123, city: cccc}

我需要加载它,首先要确保文件是正确的YAML,其次是在给定某个上下文的某个树上提取信息。我将这一切都作为嵌套的dicts,列表和原语来完成。但我无法加载文件,因为我没有原始的Python源和类定义,所以yaml.load()已经出来了。 我尝试了yaml.safe_load()但是抛出和异常。 BaseLoader加载文件,因此它是正确的。但是这会把所有原始信息(数字,日期时间)混为一体。

然后我找到了How to deserialize an object with PyYAML using safe_load?,因为文件中定义了100多个不同的标签,所以提供的解决方案是不切实际的。

我是否必须使用其他一些工具去除!!标签定义(至少有一次!!出现在普通字符串中),所以我可以使用safe_load。是否有更简单的方法来解决这个我不知道的事情?

如果没有,我将不得不做一些字符串解析来恢复类型,但我想我先问这里。

1 个答案:

答案 0 :(得分:1)

如果你想在这样的文件上使用safe_loader(),就没有必要去添加任何类的繁琐路线。

ConstructorError SafeConstructor.construct_undefined() constructor.py中应该constructor.py投放import yaml from yaml.constructor import SafeConstructor def my_construct_undefined(self, node): data = {} yield data value = self.construct_mapping(node) data.update(value) SafeConstructor.add_constructor( None, my_construct_undefined) yaml_str = """\ - !!python/object:manufacturer.Manufacturer name: aaaa address: !!python/object:address.BusinessAddress {street: bbbb, number: 123, city: cccc} """ data = yaml.safe_load(yaml_str) print(data) 。通过[{'name': 'aaaa', 'address': {'city': 'cccc', 'street': 'bbbb', 'number': 123}}] 文件中的“无”案例,该方法将在秋季注册。

如果将该信息与所有这些标记的“类”都是映射(而不是列表或标量)的事实相结合,您只需在新函数中复制映射的代码并将其注册为直通案例。

static void add(Map<Integer,List<Movie>> map, Movie movie) {
  List<Movie> list = map.get(movie.rank);
  if (list == null) {
    list = new ArrayList<Movie>();
    map.put(movie.rank, list);
  }
  list.add(movie);
}

应该得到你:

$("#symbol_id").find("g").attr('fill', "#colorOfChoice");

没有抛出异常,并且“number”作为整数而不是字符串。