yams-cpp 嵌套序列返回映射而不是值

Posted

技术标签:

【中文标题】yams-cpp 嵌套序列返回映射而不是值【英文标题】:yams-cpp nested sequence returning map instead of value 【发布时间】:2016-09-21 20:55:30 【问题描述】:

我正在尝试解析以下 config.yaml 文件。

config.yaml

foo:
  bar:
    baz: [1, 2, 3, 4]
    bam: "some_string_value"

test.cpp

YAML::Node configObj = YAML::LoadFile("cfig.yaml"); // loads file just fine

YAML::Node fooObj = configObj["foo"]; // this Node object is a Map

// iterate over foo node to get bar node
for( auto it = fooObj.begin(); it != fooObj.end(); ++it)
    YAML::Node barMap = it->second; // this Node object is a Map

    // iterate over bar node to get bad node
    for( auto i = barMap.begin(); i != barMap.end(); ++i)
        YAML::Node bazMap = i->second; // this node is a sequence

        for( std::size_t i=0; i<bazMap.size(); i++         
            auto index = bazMap[i].as<int>(); // <<< This is the problem
        
    

据我所知,问题是我希望索引是一个 int 但bazMap[i].as&lt;int&gt;() 我希望第一个循环是 1,第二个循环是 2,等等。我得到的是 bazMap[i].as&lt;int&gt;()是地图类型。我在这里的理解中缺少什么?

谢谢,

布鲁斯

更新 答案是我在嵌套的 for 循环中很早就停止了。

【问题讨论】:

你解决了吗?如果是这样,您实际上可以在下面写一个答案并将其标记为“已接受”。 对不起,我正在度假。我做到了,我会的。谢谢! 【参考方案1】:

我找到的答案在于我不清楚自己得到了什么。

config.yaml 文件中,我期待以下内容:

foo.Type() == Map
bar.Type() == Sequence
baz.Type() == Sequence

但我得到的是:

foo.Type() == Map
bar.Type() == Map
baz.Type() == Sequence

要解决这个问题,我所要做的就是更改配置文件。

foo:
  bar:
    - baz: [1, 2, 3, 4]
    - bam: "some_string_value"

然后它完全按照我的预期进行解析。

所以问题是配置文件的格式而不是解析逻辑。

【讨论】:

以上是关于yams-cpp 嵌套序列返回映射而不是值的主要内容,如果未能解决你的问题,请参考以下文章

如何使用映射或过滤器而不是列表推导过滤特定值的嵌套字典(pythonic 方式)?

Object.keys映射返回对象Object而不是ReactJS中的文本输入表单中的值

pmml4s model.predict() 返回数组而不是单个值

Spring框架中的Jackson反序列化错误处理

带有 valueForKeyPath 的嵌套 NSDictionary 返回括号而不是 NSString

JSON 返回嵌套数组而不是对象 [Spring boot + JPA + MySQL + REST]