Golang中处理嵌套JSON响应数组值的技巧

Golang中处理嵌套JSON响应数组值的技巧 如何从第三方API接收的每个嵌套JSON响应中移除一组特定的键值对,并以JSON格式传递给我的POST API。

第三方响应示例:

{
    "Caller": {
        "CallerID": "ABC",
        "CallerIP": "XXX"
    },
    "Environment": "DEV",
    "WorkflowName": "Something",
    "WorkflowMethod": "GET",
    "Result": "Success",
    "Output": {
        "Body": {
            "queryResponse": {
                "response_code": "SUCCESS",
                "response_message": {},
                "change_number": "abcdef",
                "templateId": "",
                "title": "random",
                "primary_application_instance": "random",
                "primary_application": "random",
                "external_csi_id": [{
                    "#text": "000000000"
                }],
                "primary_ci": {},
                "start_date": "0000-00-00 00:00:00",
                "end_date": "0000-00-00 00:00:00",
                "model": "notsure",
                "category": "something",
                "requestor": "random",
                "requestorsoeid": "random",
                "outage_start_date": {},
                "outage_end_date": {},
                "expiry_time": "0000-00-00 00:00:00",
                "justification": "random",
                "risk": "Low",
                "expedited": false,
                "expedited_reason": {},
                "backout_plan_exemption": {},
                "backout_plan": "none",
                "cob_category": {},
                "pre_test_exempt": true,
                "test_exempt_category": "dummy",
                "test_plan": "NO NEED",
                "approvals": [{
                    "assignment_group": "null",
                    "comments": {},
                    "status": "notsure",
                    "approver": "abc",
                    "updated": "0000-00-00 00:00:00"
                }]
            }
        }
    },
    "TimeStamp": "0000-00-00 00:00:00",
    "Location": null
}

我需要从此响应中移除以下部分,并使用剩余的嵌套JSON响应。

"Caller": {
    "CallerID": "ABC",
    "CallerIP": "XXX"
},
"Environment": "DEV",
"WorkflowName": "Something",
"WorkflowMethod": "GET",
"Result": "Success",
"TimeStamp": "0000-00-00 00:00:00",
"Location": null

更多关于Golang中处理嵌套JSON响应数组值的技巧的实战教程也可以访问 https://www.itying.com/category-94-b0.html

6 回复

你能分享一个代码片段吗?因为我是编程新手。

更多关于Golang中处理嵌套JSON响应数组值的技巧的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


非常感谢Jabbson!我会尝试这个方法,并在这里发布结果。

您可以通过将数据解组到一个没有指定相应不必要字段的结构体中,然后再将其重新组编为JSON格式来移除这部分。

func main() {
    fmt.Println("hello world")
}

操作JSON最广泛使用且功能强大的工具是 jq。您可以将其作为独立工具使用,也可以使用Go语言的实现:

GitHub

savaki/jq

Avatar

一个高性能的Golang实现,复现了极其有用的jq命令行工具。 - savaki/jq

处理嵌套JSON响应数组值时,可以通过定义结构体并使用json.Marshaljson.Unmarshal来移除特定键值对。以下是示例代码:

package main

import (
    "encoding/json"
    "fmt"
)

type ThirdPartyResponse struct {
    Caller         interface{} `json:"Caller,omitempty"`
    Environment    string      `json:"Environment,omitempty"`
    WorkflowName   string      `json:"WorkflowName,omitempty"`
    WorkflowMethod string      `json:"WorkflowMethod,omitempty"`
    Result         string      `json:"Result,omitempty"`
    Output         struct {
        Body struct {
            QueryResponse map[string]interface{} `json:"queryResponse"`
        } `json:"Body"`
    } `json:"Output"`
    TimeStamp interface{} `json:"TimeStamp,omitempty"`
    Location  interface{} `json:"Location,omitempty"`
}

type CleanResponse struct {
    Output struct {
        Body struct {
            QueryResponse map[string]interface{} `json:"queryResponse"`
        } `json:"Body"`
    } `json:"Output"`
}

func main() {
    jsonData := `{
        "Caller": {
            "CallerID": "ABC",
            "CallerIP": "XXX"
        },
        "Environment": "DEV",
        "WorkflowName": "Something",
        "WorkflowMethod": "GET",
        "Result": "Success",
        "Output": {
            "Body": {
                "queryResponse": {
                    "response_code": "SUCCESS",
                    "response_message": {},
                    "change_number": "abcdef",
                    "templateId": "",
                    "title": "random",
                    "primary_application_instance": "random",
                    "primary_application": "random",
                    "external_csi_id": [{
                        "#text": "000000000"
                    }],
                    "primary_ci": {},
                    "start_date": "0000-00-00 00:00:00",
                    "end_date": "0000-00-00 00:00:00",
                    "model": "notsure",
                    "category": "something",
                    "requestor": "random",
                    "requestorsoeid": "random",
                    "outage_start_date": {},
                    "outage_end_date": {},
                    "expiry_time": "0000-00-00 00:00:00",
                    "justification": "random",
                    "risk": "Low",
                    "expedited": false,
                    "expedited_reason": {},
                    "backout_plan_exemption": {},
                    "backout_plan": "none",
                    "cob_category": {},
                    "pre_test_exempt": true,
                    "test_exempt_category": "dummy",
                    "test_plan": "NO NEED",
                    "approvals": [{
                        "assignment_group": "null",
                        "comments": {},
                        "status": "notsure",
                        "approver": "abc",
                        "updated": "0000-00-00 00:00:00"
                    }]
                }
            }
        },
        "TimeStamp": "0000-00-00 00:00:00",
        "Location": null
    }`

    var resp ThirdPartyResponse
    err := json.Unmarshal([]byte(jsonData), &resp)
    if err != nil {
        panic(err)
    }

    cleanResp := CleanResponse{
        Output: resp.Output,
    }

    cleanJSON, err := json.Marshal(cleanResp)
    if err != nil {
        panic(err)
    }

    fmt.Println(string(cleanJSON))
}

如果只需要保留Output部分,可以使用更简洁的方法:

func extractOutput(jsonData string) ([]byte, error) {
    var data map[string]interface{}
    err := json.Unmarshal([]byte(jsonData), &data)
    if err != nil {
        return nil, err
    }

    output, exists := data["Output"]
    if !exists {
        return json.Marshal(map[string]interface{}{})
    }

    return json.Marshal(map[string]interface{}{
        "Output": output,
    })
}

对于需要移除多个特定字段的情况,可以使用json.RawMessage

type PartialResponse struct {
    Output json.RawMessage `json:"Output"`
}

func removeFields(jsonData []byte) ([]byte, error) {
    var partial PartialResponse
    err := json.Unmarshal(jsonData, &partial)
    if err != nil {
        return nil, err
    }

    result := map[string]interface{}{
        "Output": partial.Output,
    }

    return json.Marshal(result)
}

这些方法可以处理嵌套JSON响应,移除指定键值对,并保留需要的嵌套结构。

回到顶部