如何大写JSON数组中的所有键?

时间:2018-08-17 09:37:02

标签: json go marshalling

我正在将file.json读入内存。这是一个对象数组,示例:

[
{"id":123123,"language":"ja-JP","location":"Osaka"}
,{"id":33332,"language":"ja-JP","location":"Tokyo"}
,{"id":31231313,"language":"ja-JP","location":"Kobe"}
]

我想操纵此JSON文件中的某些键,以便它们以大写字母开头。含义

每次找到

"language"都会变成"Language"。到目前为止,我所做的就是制作一个表示每个对象的结构,如下所示:

type sampleStruct struct {
    ID                   int    `json:"id"`
    Language             string `json:"Language"`
    Location             string `json:"Location"`
}

在这里,我定义大写。意思是,id不应大写,而locationlanguage应该大写。

其余代码如下:

func main() {
    if len(os.Args) < 2 {
        fmt.Println("Missing filename parameter.")
        return
    }

    translationfile, err := ioutil.ReadFile(os.Args[1])
    fileIsValid := isValidJSON(string(translationfile))

    if !fileIsValid {
        fmt.Println("Invalid JSON format for: ", os.Args[1])
        return
    }

    if err != nil {
        fmt.Println("Can't read file: ", os.Args[1])
        panic(err)
    }
}


func isValidJSON(str string) bool {
    var js json.RawMessage
    return json.Unmarshal([]byte(str), &js) == nil
}

// I'm unsure how to iterate through the JSON objects and only uppercase the objects matched in my struct here. 
func upperCaseSpecificKeys()
// ... 

期望的输出(假设结构代表整个数据对象),根据需要转换每个键:

[
{"id":123123,"Language":"ja-JP","Location":"Osaka"}
,{"id":33332,"Language":"ja-JP","Location":"Tokyo"}
,{"id":31231313,"Language":"ja-JP","Location":"Kobe"}
]

2 个答案:

答案 0 :(得分:6)

json.Unmarshal上的文档说(重点突出):

  

要解组JSON为结构,解组匹配传入的对象   元帅使用的键的键(结构字段名称或其   标记),首选完全匹配,但也接受不区分大小写的   匹配

在此处查看示例:https://play.golang.org/p/1vv8PaQUOfg

答案 1 :(得分:0)

一种方法是实现自定义编组方法,尽管不是很灵活:

type upStruct struct {
    ID       int `json:"id"`
    Language string
    Location string
}

type myStruct struct {
    ID       int    `json:"id"`
    Language string `json:"language"`
    Location string `json:"location"`
}

func (m myStruct) MarshalJSON() ([]byte, error) {
    return json.Marshal(upStruct(m))
}
....
func main() {
    var mySArr []myStruct

    // 1. Unmarshal the input
    err := json.Unmarshal([]byte(myJson), &mySArr)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Printf("Input: \n%+v\n", mySArr)

    // 2. Then, marshal it using our custom marshal method
    val, err := json.Marshal(mySArr)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Output: \n%v\n", string(val))
}

链接到工作代码:https://play.golang.org/p/T4twqPc34k0

感谢mkopriva