можно зациклить некоторые данные JSON с вложенным значением - PullRequest
0 голосов
/ 25 сентября 2019

Когда я получил новые данные 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"
}

1 Ответ

2 голосов
/ 25 сентября 2019

Почему ваш результат показывает только 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 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, 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"
  }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...