Как десериализовать json разделенные запятыми строки из файла CSV - PullRequest
0 голосов
/ 06 марта 2020

У меня есть mysql дамп CSV-файл, содержащий два столбца, json1 и json2, оба столбца являются JSON объектами строковых представлений. Итак, строка csv выглядит следующим образом:

"{"field1":"value","field2":4}","{"field1":"value","field2":4}"

Мне нужно десериализовать эти две строки, а затем разархивировать значения от JSON до Go. Я застрял на первом этапе. У меня проблемы с ,, поскольку в самих строках JSON есть , s, поэтому читатель разбивает каждую строку на неправильное количество полей, а не на два при необходимости.

Вот мой полный код:

reader := csv.NewReader(csvFile)
reader.LazyQuotes = true //allows non-doubled quotes to appear in quoted fields

for {

    record, err := reader.Read()
    if err == io.EOF {
        break
    }
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("json1: %s json2 %s\n", record[0], record[1])
}

Что я пробовал

Я попытался установить разделитель csv на }","{ и затем добавить соответствующий } и { к результирующим строкам, но, помимо того, что они подвержены ошибкам, некоторые строки имеют NULL json1 или json2.

Наблюдения

I пользуюсь - golang 1.12.1

1 Ответ

1 голос
/ 06 марта 2020

Я бы просто использовал strings.Split(), чтобы разделить на }","{ (если вы уверены, что это всегда будет работать), тогда Unmarshall строки JSON, как вы говорите. Можете ли вы получить файл дампа, чтобы вложенные кавычки были каким-либо образом разделены?

columns := strings.Split(`"{"field1":"value","field2":4}","{"field1":"value","field2":5}"`, `}","{`)
for i, s := range columns {
    if i == 0 {
        s = s[1:]  // remove leading quote
    }
    if i == len(columns) - 1 {
        s = s[:len(s)-1] // remove trailing quote
    }
    if i > 0 {
        s = "{" + s
    }
    if i < len(columns) - 1 {
        s += "}"
    }
    // unmarshal JSON ...
}

Это немного неважно, но должно работать, даже если некоторые поля имеют значение NULL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...