json.Поле маршала, не получившее повышения, не учитывается

#json #go #marshalling

# #json #Вперед #маршалирование

Вопрос:

Я не уверен, является ли это ошибкой или особенностью, но json.Маршал не учитывает поля, которые не были повышены, потому что на верхнем уровне уже есть поле.

Например.

 type Message struct {
    Type string
    Transaction
}

type Transaction struct {
    Type string
}
 
     m := amp;Message{
        Type: "mType",
        Transaction: Transaction{
            Type: "txType",
        },
    }
    fmt.Printf("% vn", m)

    j, _ := json.Marshal(m)
    fmt.Println(string(j))
 

очевидно, что дочернее поле «Тип» не повышается из-за сообщения.Тип уже есть. Но это выводит:

 amp;{Type:mType Transaction:{Type:txType}}
{"Type":"mType"}
 

является json.Маршал, специально исключающий вложенное поле?

Ответ №1:

Оба Type поля будут преобразованы в JSON в качестве Type имени поля, а объект JSON не может содержать повторяющиеся ключи. Если вы добавите теги json в структуру и назовете поля по-другому, разоблачитель может создать действительный объект JSON, и он может маршалировать оба поля.