如何解析duktape中的递归json数据?

时间:2016-01-29 13:21:43

标签: c++ duktape

我正在尝试使用duktape解析递归数据结构,并且似乎在某处出现错误。 由于我是duktape图书馆的新手并且这些情况的例子不清楚,我想我可以问人群。

数据:

{
  "type": "window",
  "children": [
    {
      "type": "button"
    },
    {
      "type": "button"
    }
  ]
}

使用用于解析它的函数:

void parse_config() {
  duk_context* context = duk_create_heap_default();
  std::cout << "duk_create_heap_default" << std::endl;
  duk_push_string(context, input.c_str());
  std::cout << "duk_push_string" << std::endl;
  duk_json_decode(context, 0);
  std::cout << "duk_json_decode" << std::endl;
  parse_widget(context);
}

void parse_widget(duk_context* context) {
  duk_get_prop_string(context, 0, "type");
  std::cout << "duk_get_prop_string" << std::endl;
  auto type = duk_get_string(context, 1);
  std::cout << "duk_get_string" << std::endl;
  duk_pop(context);
  std::cout << "duk_pop" << std::endl;
  std::cout << "type: " << type << std::endl;
  if (duk_has_prop_string(context, 0, "children")) {
    std::cout << "duk_has_prop_string" << std::endl;
    parse_children(context);
  } else {
    std::cout << "duk_has_prop_string" << std::endl;
    std::cout << "no children" << std::endl;
  }
}

void parse_children(duk_context* context) {
  duk_get_prop_string(context, 0, "children");
  std::cout << "duk_get_prop_string" << std::endl;
  if (duk_is_array(context, 1)) {
    std::cout << "duk_is_array" << std::endl;
    duk_enum(context, 1, 0);
    std::cout << "duk_enum" << std::endl;
    while (duk_next(context, 2, 0)) {
      std::cout << "duk_next" << std::endl;
      std::cout << "parse child" << std::endl;
      parse_widget(context);
    }
  }
}

使用此版本我得到输出:

$ ./programm
duk_create_heap_default
duk_push_string
duk_json_decode
duk_get_prop_string
duk_get_string
duk_pop
type: window
duk_has_prop_string
duk_get_prop_string
duk_is_array
duk_enum
duk_next
parse child
duk_get_prop_string
duk_get_string
duk_pop
type: $

正确的输出当然应该是:

duk_create_heap_default
duk_push_string
duk_json_decode
duk_get_prop_string
duk_get_string
duk_pop
type: window
duk_has_prop_string
duk_get_prop_string
duk_is_array
duk_enum
duk_next
parse child
duk_get_prop_string
duk_get_string
duk_pop
type: button
duk_has_prop_string
no children
duk_next
parse child
duk_get_prop_string
duk_get_string
duk_pop
type: button
duk_has_prop_string
no children

所以问题仍然存在:解析数据时我的错误在哪里?

1 个答案:

答案 0 :(得分:2)

我可以看到两个问题:

  • 您正在使用parse_widget / parse_children中的值堆栈索引0和1,一旦递归,这将是不正确的。请注意,当您执行正常的C函数调用时,堆栈索引0不会更改(但在使用例如duk_call()调用本机/ Ecmascript函数时会发生更改)。您应该使用负索引来引用相对于堆栈顶部的项目;您也可以使用非负索引,但要跟踪正在处理的当前窗口小部件的基本索引。

  • children数组缺少duk_pop(),以及duk_next()循环中的枚举键和值。