2015-07-21 3 views
2

Я пытаюсь создать JSON для Terraform file. Поскольку я (думаю, я) хочу использовать marshalling вместо того, чтобы катить мой собственный JSON, я использую формат Terraforms JSON вместо «родного» формата TF.Маршал динамический JSON теги поля в Go

{ 
    "resource": [ 
    { 
     "aws_instance": { 
     "web1": { 
      "some": "data" 
     } 
    }] 
} 

resource и aws_instance статические идентификаторы в то время как web1 в этом случае является случайным именем. Также было бы немыслимо также иметь web2 и web3.

type Resource struct { 
    AwsResource AwsResource `json:"aws_instance,omitempty"` 
} 

type AwsResource struct { 
    AwsWebInstance AwsWebInstance `json:"web1,omitempty"` 
} 

Проблема однако; Как я могу генерировать случайные/переменные ключи JSON с тегами поля Go?

У меня такое чувство, что ответ «Ты не делаешь». Какие у меня другие альтернативы?

+0

Вы можете использовать подход, основанный на lexer, например [gabs] (https://github.com/Jeffail/gabs), но тогда вы не получите идиоматическую доброту структуры. – Momer

ответ

5

В большинстве случаев, когда имеются имена не известны во время компиляции, карта может быть использована:

type Resource struct { 
    AWSInstance map[string]AWSInstance `json:"aws_instance"` 
} 

type AWSInstance struct { 
    AMI string `json:"ami"` 
    Count int `json:"count"` 
    SourceDestCheck bool `json:"source_dest_check"` 
    // ... and so on 
} 

Вот пример, показывающий, как построить значение для сортировочных:

r := Resource{ 
    AWSInstance: map[string]AWSInstance{ 
     "web1": AWSInstance{ 
      AMI: "qdx", 
      Count: 2, 
     }, 
    }, 
} 

playground example

+0

Но это решение для Unmarshalling, и в этом случае будет достаточно карты и цикла for. Но мне нужно динамическое именование на выходе/сортировке. –

+0

@GerbenJacobs работает как для ввода, так и для вывода. Я добавил пример игровой площадки, показывающий, как использовать его для вывода. –

+0

Ahh, называя их при инициализации структуры. Не думал об этом, спасибо! –

Смежные вопросы