golang格式数据一次转换为JSON格式

golang格式数据一次转换为JSON格式,json,regex,go,formatting,string-formatting,Json,Regex,Go,Formatting,String Formatting,我的原始数据格式: id=1, name=peter, age=12 我将其转换为JSON字符串: {"id" : "1", "name" : "peter", "age" : "12"} 我使用以下golang语句进行转换: Regex, err = regexp.Compile(`([^,\s]*)=([^,\s]*)`) JSON := fmt.Sprintf("{%s}", Regex.ReplaceAllString(inp, `"$1" : "$2"`)) inp是保存原始

我的原始数据格式:

id=1, name=peter, age=12
我将其转换为JSON字符串:

{"id" : "1", "name" : "peter", "age" : "12"}
我使用以下golang语句进行转换:

Regex, err = regexp.Compile(`([^,\s]*)=([^,\s]*)`)  
JSON := fmt.Sprintf("{%s}", Regex.ReplaceAllString(inp, `"$1" : "$2"`))
inp
是保存原始数据格式的变量

但是,现在我得到了一种新的格式:

id=1 name=peter age=12
我还想使用与上面使用的方法类似的方法将其转换为JSON字符串,即使用正则表达式进行一次性格式化

{"id"="1", "name"="peter", "age"="12"}
我怎样才能做到这一点

更新:一项额外要求。如果输入格式为

id=1, name=peter, age="12"

我需要摆脱“生存”或“逃跑”\“这样我可以在下一步进行处理。双引号可以出现在任何值字段的开头和结尾。

问题有两个部分:简单的部分是序列化为JSON,Go有这样做的方法。我会使用这个库,而不是自己尝试编码JSON

问题中稍微棘手的部分是将输入解析为可以轻松序列化的结构或映射,并使其足够灵活以接受不同的输入格式

我将使用一个通用接口将文本转换为结构或映射,然后实现用于解析每个新输入类型的接口

示例代码:(您可以运行它)


您的JSON字符串无效。。。你的意思是
{“id”:“1”,“name”:“peter”,“age”:“12”}
?@JohnWeldon,谢谢你的关注。更新!你能告诉我哪个图书馆能做到这一点吗?另外,请提供一些示例代码。它是否处理值字段具有特殊字符的情况,例如“是的,你真正的问题是解析输入格式。我将提供一些示例代码,但您必须准确地了解如何解析输入。。。只是想让你开始,你需要适应你的需要。
package main

import (
    "encoding/json"
    "errors"
    "fmt"
    "strings"
)

// parseFn describes the function for converting input into a map.
// This could be a struct or something else if the format is well known.
// In real code this would return map[string]interface{}, but for this
// demo I'm just using string
type parseFn func(string) (map[string]string, error)

// parseFormat1 is for fields separated by commas
func parseFormat1(in string) (map[string]string, error) {
    data := map[string]string{}
    fields := strings.Split(in, ",")
    for _, field := range fields {
        pair := strings.Split(field, "=")
        if len(pair) != 2 {
            return nil, errors.New("invalid input")
        }
        data[strings.Trim(pair[0], ` "`)] = strings.Trim(pair[1], ` "`)
    }
    return data, nil
}

// parseFormat2 is for lines with no commas
func parseFormat2(in string) (map[string]string, error) {
    data := map[string]string{}
    fields := strings.Split(in, " ")
    for _, field := range fields {
        pair := strings.Split(field, "=")
        if len(pair) != 2 {
            return nil, errors.New("invalid input")
        }
        data[strings.Trim(pair[0], ` "`)] = strings.Trim(pair[1], ` "`)
    }
    return data, nil
}

// nullFormat is what we fall back on when we just don't know
func nullFormat(in string) (map[string]string, error) { return nil, errors.New("invalid format") }

// classify just tries to guess the parser to use for the input
func classify(in string) parseFn {
    switch {
    case strings.Count(in, ", ") > 1:
        return parseFormat1
    case strings.Count(in, " ") > 1:
        return parseFormat2
    default:
        return nullFormat
    }
}

func main() {
    testCases := []string{
        `id=1, name=peter, age=12`,
        `id=1, name=peter, age="12"`,
        `id=1 name=peter age=12`,
        `id=1;name=peter;age="12"`,
    }

    for ix, tc := range testCases {
        pfn := classify(tc)
        d, err := pfn(tc)
        if err != nil {
            fmt.Printf("\nerror parsing on line %d: %v\n", ix, err)
            continue
        }
        b, err := json.Marshal(d)
        if err != nil {
            fmt.Printf("\nerror marshaling on line %d: %v\n", ix, err)
            continue
        }
        fmt.Printf("\nSuccess on line %d:\n INPUT: %s\nOUTPUT: %s\n", ix, tc, string(b))
    }
}