登录
首页 >  Golang >  Go问答

清理 JSON 文件中的无效字符

来源:stackoverflow

时间:2024-03-06 18:45:25 302浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《清理 JSON 文件中的无效字符》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

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

由于该文件是从 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 文件中的无效字符》文章吧,也可关注golang学习网公众号了解相关技术文章。

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>