当前位置: 首页 > 面试题库 >

如何正确解组不同类型的数组?

杜英叡
2023-03-14
问题内容

只要我有键值对,解组就非常简单了,但是我将如何以不同的顺序解组不同类型的数组呢?单个元素定义明确且已知,但顺序不明确。

我无法提出一个漂亮的解决方案。

我会尝试对所有元素进行错误处理吗?是否有某种工会类型可以为我做到这一点?

游乐场版

package main

import (
    "encoding/json"
    "fmt"
)

var my_json string = `{
    "an_array":[
        "with_a string",
        {
            "and":"some_more",
            "different":["nested", "types"]
        }
    ]
}`

type MyInner struct {
    And     string
    Different   []string
}

type MyJSON struct {
    An_array []json.RawMessage
}

func main() {
    var my_json_test MyJSON

    e := json.Unmarshal([]byte(my_json), &my_json_test)
    if e != nil {
        fmt.Println(e)
    } else {
        for index, value := range my_json_test.An_array {
            fmt.Println("index: ", index)
            fmt.Println("value: ", string(value))
        }
        var my_inner MyInner
        err := json.Unmarshal(my_json_test.An_array[1], &my_inner)
        if err != nil {
            fmt.Println(err)
        } else {
            fmt.Println("inner structure: ", my_inner)
        }
    }
}

问题答案:

Go官方博客上有一篇不错的文章encoding/json:JSON和GO。可以将“任意数据解码”到接口{}中,并使用类型断言来动态确定类型。

您的代码可能可以修改为:

package main

import (
    "encoding/json"
    "fmt"
)

var my_json string = `{
    "an_array":[
    "with_a string",
    {
        "and":"some_more",
        "different":["nested", "types"]
    }
    ]
}`

func WTHisThisJSON(f interface{}) {
    switch vf := f.(type) {
    case map[string]interface{}:
        fmt.Println("is a map:")
        for k, v := range vf {
            switch vv := v.(type) {
            case string:
                fmt.Printf("%v: is string - %q\n", k, vv)
            case int:
                fmt.Printf("%v: is int - %q\n", k, vv)
            default:
                fmt.Printf("%v: ", k)
                WTHisThisJSON(v)
            }

        }
    case []interface{}:
        fmt.Println("is an array:")
        for k, v := range vf {
            switch vv := v.(type) {
            case string:
                fmt.Printf("%v: is string - %q\n", k, vv)
            case int:
                fmt.Printf("%v: is int - %q\n", k, vv)
            default:
                fmt.Printf("%v: ", k)
                WTHisThisJSON(v)
            }

        }
    }
}

func main() {

    fmt.Println("JSON:\n", my_json, "\n")

    var f interface{}
    err := json.Unmarshal([]byte(my_json), &f)
    if err != nil {
        fmt.Println(err)
    } else {
        fmt.Printf("JSON: ")
        WTHisThisJSON(f)
    }
}

它给出的输出如下:

JSON:
 {
    "an_array":[
    "with_a string",
    {
        "and":"some_more",
        "different":["nested", "types"]
    }
    ]
}

JSON: is a map:
an_array: is an array:
0: is string - "with_a string"
1: is a map:
and: is string - "some_more"
different: is an array:
0: is string - "nested"
1: is string - "types"

尚未完成,但显示了它如何工作。



 类似资料:
  • 问题内容: 我有一个类,可以根据消息的类将传入的消息映射到匹配的读者。所有消息类型都实现接口消息。读者在mapper类中注册,说明它将能够处理的消息类型。这些信息需要以某种方式存储在消息阅读器中,而我的方法是从构造函数中设置一个数组。 现在,似乎我对泛型和/或数组有些误解,似乎无法弄清楚,请参见下面的代码。它是什么? ETA : 正如cletus正确指出的那样,最基本的谷歌搜索表明Java不允许通

  • 问题内容: 例如: 因为json数组被解码为go数组,并且go数组需要显式定义类型,所以我不知道如何处理它。 问题答案: 首先,json无效,对象必须具有键,因此它应该类似于或just 。 而当您处理多种随机类型时,只需使用即可。

  • 我有一个数据库事务函数,可以进行多个查询,并以[resultQuery1、resultQuery2等格式返回每个查询的结果]。我不确定如何为这个泛型函数提供预期的返回类型。 游戏场 示例: 错误: 类型“(字符串|{id:number;})[]不可分配给类型“T”(字符串|{id:number;})[]”可分配给类型为“T”的约束,但“T”可以用约束“any[]”的不同子类型实例化。

  • 问题内容: 我有一个JSON项目的无序数组。根据规范http://tools.ietf.org/html/draft-zyp-json- schema-03#section-5.5 ,下面的json模式仅在数组中的对象出现在那个顺序中时才会验证。我不想指定顺序,只验证数组中的对象,而不管对象的顺序或数量如何。从规范我似乎无法理解如何完成此工作。 问题答案: 我在JSON模式Google组上问了同样

  • 问题内容: 我正在用Java处理数组,但有一个问题。我知道Java中的数组是类似数据类型的集合,如下所示: 上面的声明可以作为一个数组读取,该数组是整数类型的集合。 考虑一下: 在这里,我可以说上面的是一个数组,它是不同数据类型的集合,还是它是相似数据类型(即对象)的数组? 我对此感到困惑和怀疑。在Java中,是否可以创建可以容纳不同数据类型的数组或任何种类的集合? 问题答案: Java中的所有对

  • 如果我有一个单文件Vue类组件,例如: 然后我把它导入其他地方,得到一个实例。 使用标准Vue CLI 3设置,这会出现错误,因为它包含,内容如下: 据我所知,这意味着每当您编写导入Foo时,将只是的别名,您将无法访问其成员。 如果您从文件导入,情况似乎确实如此。如果您从文件导入,它会神奇地工作! 不幸的是,我所有的测试都是文件,因此我无法导入任何组件的类型。这使得测试变得困难。有办法解决这个问题