gpt4 book ai didi

json - 有效地从 JSON 文件中删除无效字符?

转载 作者:数据小太阳 更新时间:2023-10-29 03:10:56 62 4
gpt4 key购买 nike

我正在通过命令行读取文件。

由于该文件是从 Oracle 导出的 JSON,因此它具有一定的结构。由于某种原因,此默认结构不是有效的 JSON。示例:

// This isn't valid JSON
,"items":
[
{"id":123,"language":"ja-JP","location":"Osaka"}
,{"id":33,"language":"ja-JP","location":"Tokyo"}
,{"id":22,"language":"ja-JP","location":"Kentok"}
]}

我希望它只是一个对象数组,因此具有预期的输出:

// This is valid json
[
{"id":123,"language":"ja-JP","location":"Osaka"}
,{"id":33,"language":"ja-JP","location":"Tokyo"}
,{"id":22,"language":"ja-JP","location":"Kentok"}
]

因此,我需要从文件的最后一行中(完全)删除第 1 行以及最后的 }

正在通过输入的命令行解析文件:

file, err := ioutil.ReadFile(os.Args[1])

我正在尝试以这种方式删除无效的字符串/单词,但它不会重新格式化任何内容:

// in func main()
removeInvalidJSON(file, os.Args[1])

// later on ..
func removeInvalidJSON(file []byte, path string) {

info, _ := os.Stat(path)
mode := info.Mode()

array := strings.Split(string(file), "\n")
fmt.Println(array)

//If we have the clunky items array which is invalid JSON, remove the first line
if strings.Contains(array[0], "items") {
fmt.Println("Removing items")
array = append(array[:1], array[1+1:]...)
}

// Finds the last index of the array
lastIndex := array[len(array)-1]

// If we have the "}" in the last line, remove it as this is invalid JSON
if strings.Contains(lastIndex, "}") {
fmt.Println("Removing }")
strings.Trim(lastIndex, "}")
}

// Nothing changed?
fmt.Println(array)

ioutil.WriteFile(path, []byte(strings.Join(array, "\n")), mode)
}

上面的函数确实写入了我能看到的文件 - 但据我所知它没有改变数组,也没有将它写入文件。

我如何有效地从文件中删除文件的第一行以及最后一个假花括号 }

我在另一个函数中解码 JSON:是否有一种方法可以使用 "encoding/json" 库更“干净地”完成它?

最佳答案

此代码存在几个重大问题,导致其行为不符合预期。我在下面的评论中注意到了这些:

func removeInvalidJSON(file []byte, path string) {

info, _ := os.Stat(path)
mode := info.Mode()

array := strings.Split(string(file), "\n")
fmt.Println(array)

//If we have the clunky items array which is invalid JSON, remove the first line
if strings.Contains(array[0], "items") {
fmt.Println("Removing items")
// If you just want to remove the first item, this should be array = array[1:].
// As written, this appends the rest of the array to the first item, i.e. nothing.
array = append(array[:1], array[1+1:]...)
}

// Finds the last ~index~ *line* of the array
lastIndex := array[len(array)-1]

// If we have the "}" in the last line, remove it as this is invalid JSON
if strings.Contains(lastIndex, "}") {
fmt.Println("Removing }")
// Strings are immutable. `strings.Trim` does nothing if you discard the return value
strings.Trim(lastIndex, "}")
// After the trim, if you want this to have any effect, you need to put it back in `array`.
}

// Nothing changed?
fmt.Println(array)

ioutil.WriteFile(path, []byte(strings.Join(array, "\n")), mode)
}

我想你想要的更像是:

func removeInvalidJSON(file []byte, path string) {
info, _ := os.Stat(path)
mode := info.Mode()

array := strings.Split(string(file), "\n")
fmt.Println(array)

//If we have the clunky items array which is invalid JSON, remove the first line
if strings.Contains(array[0], "items") {
fmt.Println("Removing items")
array = array[1:]
}

// Finds the last line of the array
lastLine := array[len(array)-1]

array[len(array)-1] = strings.Trim(lastLine, "}")

fmt.Println(array)

ioutil.WriteFile(path, []byte(strings.Join(array, "\n")), mode)
}

关于json - 有效地从 JSON 文件中删除无效字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51931814/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com