Разобрать JSON с пустым строковым полем

Мне нужно разобрать JSON в структуру Go. Ниже приведена структура

      type Replacement struct {
Find        string `json:"find"`
ReplaceWith string `json:"replaceWith"`
}

Ниже приведен пример json:

      {
"find":"TestValue",
"replaceWith":""
}

Входной json может иметь пустые значения для некоторого поля. Го encoding/jsonбиблиотека по умолчанию принимает значение для любой пустой строки, представленной в JSON. У меня есть подчиненная служба, которая находит и заменяет значения в конфигурациях. Это вызывает проблемы с моей нижестоящей службой, поскольку она не принимает replaceWithпараметр. У меня есть обходной путь, где я заменяю nilзначения по "''"но это может вызвать проблему, когда некоторое значение заменяется на ''. Есть ли способ для json не анализировать пустую строку как nil и просто ""

Вот ссылка на код: https://play.golang.org/p/SprPz7mnWR6

2 ответа

Строковый тип Go не может содержать nilзначение, которое является нулевым значением для указателей, интерфейсов, карт, срезов, каналов и типов функций, представляющих неинициализированное значение.

При распаковке данных JSON для структуры, как в вашем примере ReplaceWithполе действительно будет пустой строкой ( "") - это именно то, что вы просите.

      type Replacement struct {
    Find        string `json:"find"`
    ReplaceWith string `json:"replaceWith"`
}

func main() {
    data := []byte(`
    {
           "find":"TestValue",
           "replaceWith":""
    }`)
    var marshaledData Replacement
    err := json.Unmarshal(data, &marshaledData)
    if err != nil {
        fmt.Println(err)
    }
    if marshaledData.ReplaceWith == "" {
        fmt.Println("ReplaceWith equals to an empty string")
    }
}

Вы можете использовать указатель в строке, и если значение отсутствует в JSON, оно будет равно нулю. Я делал то же самое в прошлом, но в настоящее время у меня нет кода.

Другие вопросы по тегам