Лучший способ убрать недопустимые символы json из строки json, как перед демаршалом в golang - PullRequest
0 голосов
/ 20 января 2019

Для справки: я читаю журналы устройств с устройств Android и IOS, используя adb logcat и idevicesyslog.Конкретные журналы, которые мне нужны, - это словари swift / c # / java / etc, преобразованные в строки через adb logcat / idevicesyslog.Я надеюсь взять эти журналы, которые содержат строки, подобные JSON, и преобразовать их в действительный JSON.По большей части это работает без проблем.

Однако иногда эти журналы / строковые выходные данные содержат такие символы, как (\ 134, \ M, \ t и т. Д.), Которые вызывают проблемы при демаршаллинге в JSON.Я демарширую их в JSON, чтобы отправить их в другое место.

Например, необработанный журнал устройства может иметь что-то вроде следующего: {"foo": "bar", "foo": "bar \ 134 / \ 134 /bar \ 134 / bar \ 134 / bar "} {" foo ":" bar "," foo ":" bar \ M / \ 134 / bar \ 134 / bar \ M / bar "}

Этиприводят к ошибкам типа «panic: недопустимый символ« M »в escape-коде строки» при попытке демаршировать

Большинство журналов не содержат этих символов, поэтому это не проблема.Однако, некоторые крайние случаи содержат их, и это создает проблемы.

Есть ли правильное имя для этих типов символов?(c # escape-символы?) Есть ли пакет golang, который может удалить их из строки?В настоящее время я просто удаляю те, с которыми сталкиваюсь, если они появляются в строке, но я чувствую, что есть лучший способ сделать это.Добавление тех, с которыми я сталкиваюсь, в список удаляемых символов не является хорошей практикой.

Подводя итог,

журнал idevicesyslog дает мне строку, похожую на такую: {"foo": "bar", "foo": "bar \ 134 / \ 134 / bar \ 134 / bar \ 134 / bar"}

Это не может быть распаковано.

Журнал idevicesyslog дает мне такую ​​строку: {"foo": "bar", "foo": "bar bar bar bar"}

Это можно разобрать.

Текущее решение: добавить новые, с которыми я сталкиваюсь, в списоки удалите их перед демаршалированием

Обнадеживающее решение: обнаружите автоматически и удалите

1 Ответ

0 голосов
/ 20 января 2019

Используйте регулярное выражение, чтобы заменить недопустимые восьмеричные escape-последовательности пробелом:

var octalEscapePat = regexp.MustCompile(`\\[0-7]{3}`)

func fix(src string) string {
    return octalEscapePat.ReplaceAllString(src, " ")
}

Вы также можете проанализировать восьмеричное значение и преобразовать в допустимую escape-последовательность JSON:

func fix(src string) string {
    return octalEscapePat.ReplaceAllStringFunc(src, func(s string) string {
        // Parse octal value
        n, _ := strconv.ParseInt(s[1:], 8, 0)
        // Convert to string and marshal to JSON to handle any escaping
        b, _ := json.Marshal(string(n))
        // return string with surrounding quotes removed
        return string(b[1 : len(b)-1])
    })
}

С \ M можно обращаться аналогичным образом.

https://play.golang.org/p/-gtxrvnBSrx

...