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

去json解组选项

诸新霁
2023-03-14
问题内容

试图找到一种简单的方法来编组/分解为以下结构

type Resource struct {
    Data []ResourceData `json:"data"`
}
type ResourceData struct {
    Id string  `json:"id"`
    Type string  `json:"type"`
    Attributes map[string]interface{} `json:"attributes"`
    Relationships map[string]Resource `json:"relationships"`
}
r := Resource{}
json.Unmarshal(body, &r)

这在以下情况下很好:

body = `{"data":[{"id":"1","type":"blah"}]}`

但是我也需要它来回应:

body = `{"data":{"id":"1","type":"blah"}}` //notice no slice

我可以做一个单独的类型

type ResourceSingle struct {
    Data ResourceData `json:"data"`
}

但是,这意味着需要复制我附加到资源的所有功能,这是可能的。但是,在执行它之前,我需要先找出要解组的类型,再加上关系部分,每个类型都可能包含data:[]
{}或data {},所以这个主意不会工作。

或者我可以使用

map[string]*json.RawMessage
//or
type Resource struct {
    Data *json.RawMessage `json:"data"`
}

但是仍然,当以json形式时,我如何知道它是提供正确结构以解组的切片还是节点?

我的最后一招是将umarshal映射到map [string]接口并使用大量的反射测试..但这是漫长的尝试。

有想法吗?

亲切的问候


问题答案:

有很多方法可以构造它,但是最简单的技术归结为实现json.Unmarshaler和检查数据类型。您可以最少地解析json字节,通常只是第一个字符,或者您可以尝试解组每种类型并返回成功的类型。

我们将在此处使用后一种技术,并将ResourceData插入切片中,而不管传入数据的格式如何,因此我们始终可以以相同的方式对其进行操作:

type Resource struct {
    Data []ResourceData
}

func (r *Resource) UnmarshalJSON(b []byte) error {
    // this gives us a temporary location to unmarshal into
    m := struct {
        DataSlice struct {
            Data []ResourceData `json:"data"`
        }
        DataStruct struct {
            Data ResourceData `json:"data"`
        }
    }{}

    // try to unmarshal the data with a slice
    err := json.Unmarshal(b, &m.DataSlice)
    if err == nil {
        log.Println("got slice")
        r.Data = m.DataSlice.Data
        return nil
    } else if err, ok := err.(*json.UnmarshalTypeError); !ok {
        // something besides a type error occurred
        return err
    }

    // try to unmarshal the data with a struct
    err = json.Unmarshal(b, &m.DataStruct)
    if err != nil {
        return err
    }
    log.Println("got struct")

    r.Data = append(r.Data, m.DataStruct.Data)
    return nil
}

http://play.golang.org/p/YIPeYv4AfT



 类似资料:
  • 问题内容: 我在解组JSON结构时遇到了麻烦: 我实际上需要结果中的第二个切片项。 我目前的尝试是 输出是这样的: 但是我也尝试使用这个: 输出正常: 我还可以引用Result [1]索引: 但是我无法将接口类型转换为任何其他匹配类型。谁能告诉我如何进行界面转换。哪种方法才是“最佳”。 问题答案: 一种选择是将顶级事物解组为最初的一部分。 然后遍历成员,并查看每个成员的第一个字符。如果它是一个对象

  • 输入数据上有一个例子。 这是我在向服务器发出适当请求后收到的数据示例。我得到了这样的数据。如何序列化此类数据?由于嵌套结构列表的动态名称,我的尝试失败了。如何正确处理这种嵌套动态结构?

  • 本文向大家介绍详解javascript数组去重问题,包括了详解javascript数组去重问题的使用技巧和注意事项,需要的朋友参考一下 首先,我想到的是另建一个结果数组,用来存储原始数组中不重复的数据。遍历原始数组依次跟结果数组中的元素进行比较,检测是否重复。于是乎,我写出了如下代码A: 写完之后,忽然想起来前几天刚看的ECMAScript 5中的数组方法indexOf 可以检索数组元素。于是我又

  • 问题内容: 如何解析JSON ARRAY以获取没有[]和“”的数据 这是json 我的代码: 输出:[“ 23,Damansara-蒲种高速公路(Bandar Puchong Jaya)”,“ 47100 Puchong Batu Dua Belas,雪兰莪,”马来西亚“] 我只想要数据。如: 23,Damansara-Puchong Hwy(Bandar Puchong Jaya),47100

  • 问题内容: 我有类似以下的输出: 我想获取每个城市的名称,该怎么办? 编辑: 上面的方法似乎无效,没有输出任何值。 问题答案: 也会在提取后为您解析JSON,因此从那时起,您将使用简单的Javascript数组(在JSON中标记为数组)。该文档还包含有关如何处理获取的数据的示例。 您可以使用for循环获取数组中的所有值: 检查您的控制台以查看输出(Chrome,Firefox / Firebug

  • 问题内容: 嗨,我正在尝试从该 URL 解析json数组。json数组如下所示。 我在我的java类中这样做 但这不起作用,有人可以帮我解析我的json数组吗? 问题答案: 您将需要根据您在此处发布的用于解析为Json的字符串在当前代码中进行两次更改: 首先: 将方法的返回类型更改为并从中返回,而不是 例如: 第二: 更改代码以获取价值 :