首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >hcl,json,go :我如何迭代JSON?

hcl,json,go :我如何迭代JSON?
EN

Stack Overflow用户
提问于 2020-04-29 15:39:34
回答 1查看 106关注 0票数 0

问题:我试图遍历JSON-content并像键、值对一样显示结果。

我已经写了一些读取hcl文件的代码,然后用hcldec.Decode解码这些文件,然后将结果转换成JSON。这些hcl文件定义应用程序的源和目标,如下所示:

source.hcl:

代码语言:javascript
运行
复制
source json "namefile" {
  attr firstName  {
    type = "varchar"
    expr = "$.firstName"
    length = "30"
  }
  attr lastName  {
    type = "varchar"
    expr = "$.lastName"
    length = "40"
  }
  attr gender  {
    type = "varchar"
    expr = "$.gender"
    length = "10"
  }
  attr age {
    type = "varchar"
    expr = "$.age"
    length = "2"
  }
}

target.hcl

代码语言:javascript
运行
复制
target table {
  cols firstName {
    name=source.json.namefile.attr.firstName.expr
    type=source.json.namefile.attr.firstName.type
    length=source.json.namefile.attr.firstName.length
  }
  cols lastName {
    name=source.json.namefile.attr.lastName.expr
    type=source.json.namefile.attr.lastName.type
    length=source.json.namefile.attr.lastName.length
  }
}

解码过程如下所示:

代码语言:javascript
运行
复制
tspec := hcldec.ObjectSpec{
    "target": &hcldec.BlockMapSpec{
        TypeName:   "target",
        LabelNames: []string{"table"},
        Nested: hcldec.ObjectSpec{
            "cols": &hcldec.BlockMapSpec{
                TypeName:   "cols",
                LabelNames: []string{"name"},
                Nested: &hcldec.ObjectSpec{
                    "name": &hcldec.AttrSpec{
                        Name:     "name",
                        Type:     cty.String, //cty.List(cty.String),
                        Required: false,
                    },
                    "type": &hcldec.AttrSpec{
                        Name:     "type",
                        Type:     cty.String, //cty.List(cty.String),
                        Required: false,
                    },
                    "length": &hcldec.AttrSpec{
                        Name:     "length",
                        Type:     cty.String, //cty.List(cty.String),
                        Required: false,
                    },
                },
            },
        },
    },
}


targ, _ := hcldec.Decode(body, tspec, &hcl.EvalContext{
    Variables: map[string]cty.Value{
        "source": val.GetAttr("source"),
    },
    Functions: nil,
})

j := decodeCtyToJson(targ, true)
log.Debugf("targ -j (spec): %s", string(j))    // debug info

其中decodeCtyToJson返回[]字节,如下所示:

代码语言:javascript
运行
复制
func decodeCtyToJson(value cty.Value, pretty bool) []byte {
    jsonified, err := ctyjson.Marshal(value, cty.DynamicPseudoType)
    if err != nil {
        log.Debugf("Error: #v", err)
        return nil
    }
    if pretty {
        return jsonPretty.Pretty(jsonified)
    }
    return jsonified
}

现在,当我尝试打印JSON-content时,我没有得到我想要的东西:

代码语言:javascript
运行
复制
var result map[string]interface{}
json.Unmarshal(j, &result)
log.Debugf("result: %# v", result)

tgtfil := result["value"].(map[string]interface{})
log.Debugf("tgtfil: %v", tgtfil)

log.Debugf("len(tgtfil): %# v", len(tgtfil))
for key, value := range tgtfil {
    log.Debugf("key: %# v", key)
    log.Debugf("value: %# v", value)
}

我正在尝试获取键、值对。但是我得到了这个(首先是想要的整个JSON漂亮的打印,然后我尝试遍历JSON):

代码语言:javascript
运行
复制
DEBU[0000] targ -j (spec): {
  "value": {
    "target": {
      "table": {
        "cols": {
          "firstName": {
            "length": "30",
            "name": "$.firstName",
            "type": "varchar"
          },
          "lastName": {
            "length": "40",
            "name": "$.lastName",
            "type": "varchar"
          }
        }
      }
    }
  },
  "type": [
    "object", 
    {
      "target": [
        "map", 
        [
          "object", 
          {
            "cols": [
              "map", 
              [
                "object", 
                {
                  "length": "string",
                  "name": "string",
                  "type": "string"
                }
              ]
            ]
          }
        ]
      ]
    }
  ]
} 
DEBU[0000] result: map[string]interface {}{"type":[]interface {}{"object", map[string]interface {}{"target":[]interface {}{"map", []interface {}{"object", map[string]interface {}{"cols":[]interface {}{"map", []interface {}{"object", map[string]interface {}{"length":"string", "name":"string", "type":"string"}}}}}}}}, "value":map[string]interface {}{"target":map[string]interface {}{"table":map[string]interface {}{"cols":map[string]interface {}{"firstName":map[string]interface {}{"length":"30", "name":"$.firstName", "type":"varchar"}, "lastName":map[string]interface {}{"length":"40", "name":"$.lastName", "type":"varchar"}}}}}} 
DEBU[0000] tgtfil: map[target:map[table:map[cols:map[firstName:map[length:30 name:$.firstName type:varchar] lastName:map[length:40 name:$.lastName type:varchar]]]]] 
DEBU[0000] len(tgtfil):  1                              
DEBU[0000] key: "target"                                
DEBU[0000] value: map[string]interface {}{"table":map[string]interface {}{"cols":map[string]interface {}{"firstName":map[string]interface {}{"length":"30", "name":"$.firstName", "type":"varchar"}, "lastName":map[string]interface {}{"length":"40", "name":"$.lastName", "type":"varchar"}}}} 

Process finished with exit code 0

我在这里的目标是最终能够遍历target.hcl中定义的所有属性(在本例中是每个cols的长度、名称和类型)。然后从该信息生成DDL代码,并最终在例如Presto中实现DDL。

但到目前为止,我还不能分离出这些信息。

任何关于如何做到这一点的建议都是值得感谢的。

谢谢,/b

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-05 15:42:20

我的解决方案是为目标创建一个结构,而不是使用目标规范。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61496581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档