jjzjj

json - 将复杂的 JSON 解码为结构并访问数据( slice 的 slice )

coder 2024-07-14 原文

一段时间以来,我一直在为这个问题而烦恼。我有一个 JSON 文件,它必须采用以下格式,我需要在 Go 中迭代并使用 IF 语句:

[
[
    {
        "configName": "customer"
    },
    {
        "config": [
            {
                "emailSubject": "New customer added"
            },
            {
                "text": "Hi test 2"
            },
            {
                "text": "added 2"
            }
        ]
    }
]
[
    {
        "configName": "customerAndUser"
    },
    {
        "config": [
            {
                "emailSubject": "New customer added"
            },
            {
                "text": "Hi, test 1"
            },
            {
                "text": "added 1"
            }
        ]
    }
]
]

我想把它放到一个结构中,像这样:

type Config [][]struct {
    configName string `json: configName`
    config     []struct {
        Text         string `json: text`
        EmailSubject string `json: emailSubject`
    } `json: config`
}

我可以像这样很好地解码数据:

configData, err := ioutil.ReadFile("testing-config.json")
if err != nil {
    fmt.Println(err)
}
var configDataUnmarshalled Config

json.Unmarshal([]byte(configData), &configDataUnmarshalled)

然后数据打印出来,还好,但这里有点奇怪:打印语句为我没有指定要打印的项目返回空白。以下是我打印未编码数据时打印的示例:

打印未编码数据的输出:

[[{customer []} { [{ New customer added} {hi test 2 } {added 2 }]}] [{customerAndUser []} { [{ New customer added} {hi test 1 } {added 1 }]}]]

但是我似乎无法使用 IF 语句或循环遍历配置键中的元素!

IF 语句在 for 循环中被忽略(见代码下方的输出)

for _, configs := range configDataUnmarshalled {

    for _, configurations := range configs {

        fmt.Println("These are the top level elements in my struct: ", configurations.ConfigName)

        if configurations.ConfigName == "customerAndUser" {

            for _, config := range configurations.Config {

                fmt.Println(config)
            }
        }
    }
}

这是打印的内容:

These are the top level elements in my struct:  customer
These are the top level elements in my struct:
These are the top level elements in my struct:  customerAndUser
These are the top level elements in my struct:

从 FOR 循环中,您可以看到我想在配置具有特定名称时访问数据,在本例中为“customerAndUser”

这里完全忽略了 IF 语句

我有两件事想了解/解决:

  1. 如何访问 IF 语句后的数据
  2. 为什么程序打印空白?

期望的输出是打印出 emailSubject 和两个 Text 元素的数据到名为 customerAndUser 的配置的控制台

应该打印什么:

New customer added
hi test 1
added 1

谢谢你的帮助

最佳答案

json 配置很臭。包含 configNameconfig 的结构是一个 slice 中的两个独立结构。 configName 具有值,因此 config 为空且向后。这将在像这样的 json 时起作用。

{
        "configName": "customerAndUser",
        "config": [
            {
                "emailSubject": "New customer added"
            },
            {
                "text": "Hi, test 1"
            },
            {
                "text": "added 1"
            }
        ]
 }

所以如果你不能改变 json 配置格式。这是解决方案

endUser := false

for _, configs := range configDataUnmarshalled {

    endUser = false
    for _, configurations := range configs {

        if configurations.ConfigName == "customerAndUser" {
            endUser = true
            continue
        }

        if !endUser || len(configurations.Config) == 0 {
            continue
        }

        for _, config := range configurations.Config {
            fmt.Println(config)
        }
    }
}

关于json - 将复杂的 JSON 解码为结构并访问数据( slice 的 slice ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53540007/

有关json - 将复杂的 JSON 解码为结构并访问数据( slice 的 slice )的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  6. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  7. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  8. ruby - 是否有用于序列化和反序列化各种格式的对象层次结构的模式? - 2

    给定一个复杂的对象层次结构,幸运的是它不包含循环引用,我如何实现支持各种格式的序列化?我不是来讨论实际实现的。相反,我正在寻找可能会派上用场的设计模式提示。更准确地说:我正在使用Ruby,我想解析XML和JSON数据以构建复杂的对象层次结构。此外,应该可以将该层次结构序列化为JSON、XML和可能的HTML。我可以为此使用Builder模式吗?在任何提到的情况下,我都有某种结构化数据-无论是在内存中还是文本中-我想用它来构建其他东西。我认为将序列化逻辑与实际业务逻辑分开会很好,这样我以后就可以轻松支持多种XML格式。 最佳答案 我最

  9. ruby-on-rails - 如何使用 Rack 接收 JSON 对象 - 2

    我有一个非常简单的RubyRack服务器,例如:app=Proc.newdo|env|req=Rack::Request.new(env).paramspreq.inspect[200,{'Content-Type'=>'text/plain'},['Somebody']]endRack::Handler::Thin.run(app,:Port=>4001,:threaded=>true)每当我使用JSON对象向服务器发送POSTHTTP请求时:{"session":{"accountId":String,"callId":String,"from":Object,"headers":

  10. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

随机推荐