在不知道Golang结构的情况下编辑JSON文件中的值

时间:2016-11-28 17:08:05

标签: json go

我有一个JSON文件,其中包含如下数据

{
    "id": "0001",
    "type": "donut",
    "name": "Cake",
    "ppu": 0.55,
    "batters": {
        "batter": [{
            "id": "1001",
            "type": "Regular"
        }, {
            "id": "1002",
            "type": "Chocolate"
        }]
    },
    "topping": [{
        "id": "5001",
        "type": "None"
    }, {
        "id": "5002",
        "type": "Glazed"
    }, {
        "id": "5005",
        "type": "Sugar"
    }, {
        "id": "5007",
        "type": "Powdered Sugar"
    }]
}

我需要编辑'batter'数组中的'id'值。 假设我没有使用ant struct类型来解组。编辑后我需要再次将更新的JSON字符串写回文件。

1 个答案:

答案 0 :(得分:0)

你可以在没有结构的情况下完成它,但这意味着在整个地方使用强制转换。这是一个working example

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    str := "{ \"id\": \"0001\", \"type\": \"donut\", \"name\": \"Cake\", \"ppu\": 0.55, \"batters\": { " +
                "\"batter\": [{ \"id\": \"1001\", \"type\": \"Regular\" }, { \"id\": \"1002\", \"type\": " +
                "\"Chocolate\" }] }, \"topping\": [{ \"id\": \"5001\", \"type\": \"None\" }, { \"id\": \"5002\", " +
                "\"type\": \"Glazed\" }, { \"id\": \"5005\", \"type\": \"Sugar\" }, { \"id\": \"5007\", \"type\": " +
                "\"Powdered Sugar\" }] }"

    jsonMap := make(map[string]interface{})
    err := json.Unmarshal([]byte(str), &jsonMap)
    if err != nil {
        panic(err)
    }

    batters := jsonMap["batters"].(map[string]interface{})["batter"]

    for _, b := range(batters.([]interface{})) {
        b.(map[string]interface{})["id"] = "other id"
    }

    str2, err := json.Marshal(jsonMap)
    fmt.Println(string(str2))   
}

我认为你最好使用结构。