kdb mount config.json user/tests/yajl yajl
kdb set user/tests/yajl 'This May Be the Year I Disappear'
kdb ls user/tests/yajl
#> user/tests/yajl
kdb get user/tests/yajl
最后一条命令应打印文本This May Be the Year I Disappear
。
最后一条命令显示一个空行。
感谢您报告问题!
这样的JSON文档会是什么样子? 我们还需要有关仅包含父键的配置文件特殊语义的文档。
这样的JSON文档会是什么样子?
在这种情况下,文档仅包含一个字符串:
"This May Be the Year I Disappear"
。 如果我将配置文件替换为上述内容,则插件已经读取了正确的值:
printf '"This May Be the Year I Disappear"' > (kdb file user/tests/yajl/)
kdb get user/tests/yajl
#> This May Be the Year I Disappear
。
所以只需要固定设置? 听起来很简单!
所以只需要固定设置?
据我所知,是的。
我想我可以将这作为我的第一个问题。 您能给我一些指向我应该开始看@ markus2330的提示吗? 谢谢。
源在src / plugins / yajl / yajl_gen.c和src / plugins / yajl / yajl_parse.c中
幸运的是, @ sanssecours写了一篇很棒的教程,描述了存储插件的行为(请参阅doc / tutorials / storage-plugins.md)。 因此,您可以将其作为下一个问题#2132(#2477可能是此问题的结果)和其他与yajl相关的问题。 您的主要工作可能是验证yajl插件中的数组,或者甚至更好地用作外部插件(请参阅#1862)。
如果我挂载一个空的json文档(意味着它仅包含{}
),那么当我调用kdb set system/lvas/cm/yajl "test"
时会发生以下情况。
调用elektraYajlSet
的键集以(system/lvas/cm/yajl,test)
作为值。
在对elektraGenEmpty
的调用中,第二个子句被执行,因为它们的KeySets大小为1。
strcmp也成功,因为parentKey与Keyset中的最后一个键具有相同的值。
生成一个空映射,并且elektraYajlSet终止。 因此该函数接收该值,但不对其执行任何操作。
因此,在生成空映射的那一点上,我可以添加代码,以将键值输出到json文档中,如@sanssecours here所述。
这将起作用,因为kdb get可以正确读取该值,并且像kdb set system/lvas/cm/yajl/second "hi"
这样的调用会生成一个像{"__dirdata": "test", "second": "hi"}
这样的json文档,该文档将按预期映射键。
我认为该解决方案会起作用,但是如果我可以将json文档直接设置为{"__dirdata": "test"}
,那么我会觉得它更干净,这在语义上是相同的。
但是我不确定该怎么做。 我认为正确的方法是directoryvalue插件将修改elektraYajlSet接收的Keyset。 或者我想我可以在elektraYajlSet中自己修改KeySet。
您有@ markus2330的建议吗?
是的,directoryvalue修改了keySet elektraYajlSet接收到的值。 但是,如果仅存在parentKey(因为它不被视为“目录”),则不会发生这种情况。因此,如果仅设置了已经发现的父键,则将执行elektraGenEmpty并执行strcmp成功。
但是elektraGenEmpty有一些假设,这些假设现在不再成立(它是在directoryvalue存在之前编写的)。 因此还有其他错误,例如#2132
我认为该解决方案会行得通,但是如果我可以将json文档直接设置为{“ __dirdata”:“ test”},我会觉得它更干净,这在语义上是相同的。
{"": "test"}
不会是描述单个值的最小文档吗? 这似乎也是“骆驼”插件的行为。
@sanssecours您是否可以扩展storage-tutorial以也描述parentKeys和“空键”(%)(或至少现在称为TODO)?
我对父键没有什么特别的了解。
除了某些配置文件格式没有简单描述没有键的值的方法外,它也没有其他特殊之处。
“空键”(%)
使用空键可以映射{"root": {"": "something"}}
类的文档。 您如何将其当前映射到KeySet?
我不确定这是否是YAJL进一步解决问题的正确方法,因为有效的JSON文档似乎总是需要顶层的数组或对象。
这似乎已经改变了: https :
在https://www.ietf.org/rfc/rfc7159.txt中甚至有示例显示允许“仅值”。 但是似乎yajl不支持此...(yajl 2.1.0-2 + b3产生错误Expected “{” but found “"”
)
借助RFC 7159中的功能,我们可以映射:
"some value"
-> parent =“一些值”
{"", "some value"}
->父级/%=“某个值”
但是那时我们将需要解决yajl ...(ChangeLog也不表示此功能是在以后添加的)。
使用空键可以映射诸如{“ root”:{“”:“ something”}}之类的文档。 您如何将其当前映射到KeySet?
似乎YAML CPP可以正确处理此数据:
kdb mount config.yaml user/tests/yaml yamlcpp
printf '{"root": {"": "something"}}' > "$(kdb file user/tests/yaml)"
kdb ls user/tests/yaml
#> user/tests/yaml/root/%
kdb get user/tests/yaml/root/%
#> something
。 我没有为空键改编插件。 仅使用正确的字符串值( ""
)在存储插件中调用setBaseName
,就足以支持此功能。
很高兴看到这无需额外处理即可开箱即用:+1:
@sanssecours我们现在要支持RFC 7159吗? 如果只设置了parentKey,您的插件会做什么?
我们现在是否要支持RFC 7159?
我认为在顶层支持每种数据类型都是有意义的。
如果只设置了parentKey,您的插件会做什么?
他们只是存储文本(没有密钥):
kdb mount config.yaml user/tests/yaml yamlcpp
kdb set user/tests/yaml value
kdb file user/tests/yaml | xargs cat
#> value
。
我在此commit中为顶层添加了特殊处理。
这破坏了yajl模块中的测试,但是在我花时间修复要首先检查的问题之前,如果那是@ markus2330可接受的解决方案?
只是详细说明一下:如果KeySet的大小为1,那么我可以确定其中只有顶级键。 然后,我生成该键的值。 但是在那种情况下,我必须防止elektraGenOpenValue
被调用,因为否则它将以字符串形式生成键。
似乎YAML CPP可以正确处理此数据:
...
这个例子对我来说适用于yajl。 我想念什么吗?
打破了yajl模块中的测试
哪个考试? (另请参见下文)
我想先检查一下,是否可以接受
在以下情况下,更容易看出某事是否可以接受:
这个例子对我来说适用于yajl。 我想念什么吗?
不,此示例仅说明{"", "some value"}
不是表示parentKey值的理想方法。
我们现在是否要支持RFC 7159?
我认为在顶层支持每种数据类型都是有意义的。
我完全同意。
他们只是存储文本(没有密钥):
因此,让我们用yajl实现相同的功能。
现在对我来说非常适合!