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

标签 json go

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

由于该文件是从 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/

相关文章:

encryption - golang rsa解密没有填充?

php - http 将 url 部分路由到不同的服务器

jQuery POST 总是失败

java - 如何使用Java从json文件中提取每个元素(书签)作为一个项目?

javascript - 属性 <position> 的值无效

go - gopacket中的tcp assembly包如何使用?

go - 无法更新结构中的 map slice

javascript - 如何更新json数组中的特定值

python - 使用 pandas 从嵌套的 json 转换为 csv

GO:在结构上搜索元素的最佳方式