猿问

我可以循环一些带有嵌套值的数据 json

当我获得新的数据 json ORDER_TRX_H_ID 时,结果必须使用新的 ORDER_TRX_H_ID 循环,但我的结果始终显示最后的数据。


我的代码是


package main


import (

    "encoding/json"

    "fmt"

)


func main() {

    dataJSON := `[

{

    "QUICK_DATA_H_ID": "1",

    "ORDER_TRX_H_ID": "1",

    "FIELD_QUESTION": "FULLNAME",

    "FIELD_ANSWER": "RUBEN",

    "DTM_CRT": "2019-08-28T16:25:15.757Z"

},

{

    "QUICK_DATA_H_ID": "2",

    "ORDER_TRX_H_ID": "1",

    "FIELD_QUESTION": "ALAMAT_KTP",

    "FIELD_ANSWER": "jalandisana",

    "DTM_CRT": "2019-08-28T16:25:15.757Z"

},

{

    "QUICK_DATA_H_ID": "3",

    "ORDER_TRX_H_ID": "2",

    "FIELD_QUESTION": "FULLNAME",

    "FIELD_ANSWER": "Fariz",

    "DTM_CRT": "2019-08-28T16:25:15.757Z"

},

{

    "QUICK_DATA_H_ID": "4",

    "ORDER_TRX_H_ID": "2",

    "FIELD_QUESTION": "ALAMAT_KTP",

    "FIELD_ANSWER": "Bogor",

    "DTM_CRT": "2019-08-28T16:25:15.757Z"

}

    ]`

    var data []map[string]interface{}

    json.Unmarshal([]byte(dataJSON), &data)

    qa := map[string]interface{}{}

    for _, v := range data {

        qa[v["FIELD_QUESTION"].(string)] = v["FIELD_ANSWER"]

    }

    hasil := data[0]

    hasil["QUESTION"] = qa

    delete(hasil, "FIELD_QUESTION")

    delete(hasil, "FIELD_ANSWER")

    hasilJSON, _ := json.MarshalIndent(hasil, "", "  ")

    fmt.Println(string(hasilJSON))

}

您可以运行我的代码 https://play.golang.org/p/aHUoYZlEQs4


我的结果总是显示最后的数据


{

  "DTM_CRT": "2019-08-28T16:25:15.757Z",

  "ORDER_TRX_H_ID": "1",

  "QUESTION": {

    "ALAMAT_KTP": "Bogor",

    "FULLNAME": "Fariz"

  },

  "QUICK_DATA_H_ID": "1"

}

我的预期结果


{

  "DTM_CRT": "2019-08-28T16:25:15.757Z",

  "ORDER_TRX_H_ID": "1",

  "QUESTION": {

    "ALAMAT_KTP": "jalandisana",

    "FULLNAME": "RUBEN"

  },

  "QUICK_DATA_H_ID": "1"

},

{

  "DTM_CRT": "2019-08-28T16:25:15.757Z",

  "ORDER_TRX_H_ID": "2",

  "QUESTION": {

    "ALAMAT_KTP": "Bogor",

    "FULLNAME": "Fariz"

  },

  "QUICK_DATA_H_ID": "2"

}


素胚勾勒不出你
浏览 122回答 1
1回答

缥缈止盈

为什么你的结果只显示1个数据?是因为这行代码:hasil := data[0]hasil总是只有一个元素也qa将只包含这样的值:{  "ALAMAT_KTP": "BOGOR",  "FULLNAME": "Fariz"}因为每次data迭代,qa[v["FIELD_QUESTION"].(string)]由于v["FIELD_QUESTION"].(string)不唯一,都会被替换,所以在 的第 3 次迭代中data,qa["ALAMAT_KTP]已经有值的"jalandisana"被替换为qa["ALAMAT_KTP] = "Bogor"我在这里修改了您的代码:https ://play.golang.org/p/Ca4aGPGJwT7我用2个map[string]map[string]interface{}来容纳qa,modified data 然后我将它们合二为一package mainimport (    "encoding/json"    "fmt")func main() {    dataJSON := `[        {            "QUICK_DATA_H_ID": "1",            "ORDER_TRX_H_ID": "1",            "FIELD_QUESTION": "FULLNAME",            "FIELD_ANSWER": "RUBEN",            "DTM_CRT": "2019-08-28T16:25:15.757Z"        },        {            "QUICK_DATA_H_ID": "2",            "ORDER_TRX_H_ID": "1",            "FIELD_QUESTION": "ALAMAT_KTP",            "FIELD_ANSWER": "jalandisana",            "DTM_CRT": "2019-08-28T16:25:15.757Z"        },        {            "QUICK_DATA_H_ID": "3",            "ORDER_TRX_H_ID": "2",            "FIELD_QUESTION": "FULLNAME",            "FIELD_ANSWER": "Fariz",            "DTM_CRT": "2019-08-28T16:25:15.757Z"        },        {            "QUICK_DATA_H_ID": "4",            "ORDER_TRX_H_ID": "2",            "FIELD_QUESTION": "ALAMAT_KTP",            "FIELD_ANSWER": "Bogor",            "DTM_CRT": "2019-08-28T16:25:15.757Z"        }    ]`    var data, finalResult []map[string]interface{}    json.Unmarshal([]byte(dataJSON), &data)    qa := map[string]map[string]interface{}{}    res := map[string]map[string]interface{}{}    for _, v := range data {        if qa[v["ORDER_TRX_H_ID"].(string)] == nil {            // initialize the map first if map is nil            qa[v["ORDER_TRX_H_ID"].(string)] = make(map[string]interface{})        }        qa[v["ORDER_TRX_H_ID"].(string)][v["FIELD_QUESTION"].(string)] = v["FIELD_ANSWER"]        delete(v, "FIELD_QUESTION")        delete(v, "FIELD_ANSWER")        // only assign res if res[key] is nil to prevent doubled data        if res[v["ORDER_TRX_H_ID"].(string)] == nil {            res[v["ORDER_TRX_H_ID"].(string)] = v        }    }    // combine qa and res in finalResult    for k, v := range res {        v["QUESTION"] = qa[k]        finalResult = append(finalResult, v)    }    hasilJSON, _ := json.MarshalIndent(finalResult, "", "  ")    fmt.Println(string(hasilJSON))}输出:[  {    "DTM_CRT": "2019-08-28T16:25:15.757Z",    "ORDER_TRX_H_ID": "1",    "QUESTION": {      "ALAMAT_KTP": "jalandisana",      "FULLNAME": "RUBEN"    },    "QUICK_DATA_H_ID": "1"  },  {    "DTM_CRT": "2019-08-28T16:25:15.757Z",    "ORDER_TRX_H_ID": "2",    "QUESTION": {      "ALAMAT_KTP": "Bogor",      "FULLNAME": "Fariz"    },    "QUICK_DATA_H_ID": "3"  }]
随时随地看视频慕课网APP

相关分类

Go
我要回答