Freigeben über


Vergleich von JSON und Bicep für Vorlagen

In diesem Artikel wird die Bicep-Syntax mit der JSON-Syntax für Azure Resource Manager-Vorlagen (ARM-Vorlagen) verglichen. In den meisten Fällen stellt Bicep eine Syntax bereit, die weniger ausführlich ist als die Entsprechung in JSON.

Wenn Sie mit der Verwendung von JSON zum Entwickeln von ARM-Vorlagen vertraut sind, verwenden Sie die folgenden Beispiele, um mehr über die entsprechende Syntax für Bicep zu erfahren.

Vergleichen vollständiger Dateien

Mit dem Bicep-Playground können Sie Bicep und entsprechende JSON nebeneinander anzeigen. Sie können die Implementierungen derselben Infrastruktur vergleichen.

Sie können beispielsweise die Datei anzeigen, um einen SQL Server und eine Datenbank bereitzustellen. Der Bizeps ist etwa halb so groß wie die ARM-Vorlage.

Screenshot von nebeneinander angeordneten Vorlagen

Ausdrücke

So verfassen Sie einen Ausdruck:

func()
"[func()]"

Parameter

So deklarieren Sie einen Parameter mit einem Standardwert:

param orgName string = 'Contoso'
"parameters": {
  "orgName": {
    "type": "string",
    "defaultValue": "Contoso"
  }
}

Verwenden Sie zum Abrufen eines Parameterwerts den von Ihnen definierten Namen:

name: orgName
"name": "[parameters('orgName')]"

Variablen

So deklarieren Sie eine Variable:

var description = 'example value'
"variables": {
  "description": "example value"
}

Verwenden Sie zum Abrufen eines Variablenwerts den von Ihnen definierten Namen:

workloadSetting: description
"workloadSetting": "[variables('description')]"

Streichinstrumente

So verketten Sie Zeichenfolgen:

name: '${namePrefix}-vm'
"name": "[concat(parameters('namePrefix'), '-vm')]"

Logische Operatoren

So geben Sie das logische UND zurück:

isMonday && isNovember
[and(parameter('isMonday'), parameter('isNovember'))]

So legen Sie einen Wert bedingt fest:

isMonday ? 'valueIfTrue' : 'valueIfFalse'
[if(parameters('isMonday'), 'valueIfTrue', 'valueIfFalse')]

Bereitstellungsumfang

So legen Sie den Zielbereich der Bereitstellung fest:

targetScope = 'subscription'
"$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#"

Ressourcen

So deklarieren Sie eine Ressource:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2025-04-01' = {
  ...
}
"resources": [
  {
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2024-03-01",
    ...
  }
]

So stellen Sie eine Ressource bedingt bereit:

resource virtualMachine 'Microsoft.Compute/virtualMachines@2025-04-01' = if(deployVM) {
  ...
}
"resources": [
  {
    "condition": "[parameters('deployVM')]",
    "type": "Microsoft.Compute/virtualMachines",
    "apiVersion": "2024-03-01",
    ...
  }
]

So legen Sie eine Ressourceneigenschaft fest:

sku: '2016-Datacenter'
"sku": "2016-Datacenter",

So rufen Sie die Ressourcen-ID einer Ressource in der Vorlage ab:

nic1.id
[resourceId('Microsoft.Network/networkInterfaces', variables('nic1Name'))]

Schleifen

So durchlaufen Sie Elemente in einem Array oder einer Anzahl:

[for storageName in storageAccountNames: {
  ...
}]
"copy": {
  "name": "storagecopy",
  "count": "[length(parameters('storageAccountNames'))]"
},
...

Ressourcenabhängigkeiten

Für Bicep können Sie eine explizite Abhängigkeit festlegen, aber dieser Ansatz wird nicht empfohlen. Verwenden Sie stattdessen implizite Abhängigkeiten. Eine implizite Abhängigkeit wird erstellt, wenn eine Ressourcendeklaration auf den Bezeichner einer anderen Ressource verweist.

Im Folgenden finden Sie eine Netzwerkschnittstelle mit einer impliziten Abhängigkeit von einer Netzwerksicherheitsgruppe. Sie verweist auf die Netzwerksicherheitsgruppe mit netSecurityGroup.id.

resource netSecurityGroup 'Microsoft.Network/networkSecurityGroups@2025-01-01' = {
  ...
}

resource nic1 'Microsoft.Network/networkInterfaces@2025-01-01' = {
  name: nic1Name
  location: location
  properties: {
    ...
    networkSecurityGroup: {
      id: netSecurityGroup.id
    }
  }
}

Wenn Sie eine explizite Abhängigkeit festlegen müssen, verwenden Sie Folgendes:

dependsOn: [ storageAccount ]
"dependsOn": ["[resourceId('Microsoft.Storage/storageAccounts', 'parameters('storageAccountName'))]"]

Referenzressourcen

So rufen Sie eine Eigenschaft aus einer Ressource in der Vorlage ab:

storageAccount.properties.primaryEndpoints.blob
[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))).primaryEndpoints.blob]

So rufen Sie eine Eigenschaft aus einer vorhandenen Ressource ab, die nicht in der Vorlage bereitgestellt wird:

resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' existing = {
  name: storageAccountName
}

// use later in template as often as needed
storageAccount.properties.primaryEndpoints.blob
// required every time the property is needed
"[reference(resourceId('Microsoft.Storage/storageAccounts/', parameters('storageAccountName')), '2019-06-01').primaryEndpoints.blob]"

Verwenden Sie in Bicep den geschachtelten Accessor (::), um eine Eigenschaft für eine in einer übergeordneten Ressource geschachtelte Ressource zu erhalten:

VNet1::Subnet1.properties.addressPrefix

Verwenden Sie für JSON die Referenzfunktion:

[reference(resourceId('Microsoft.Network/virtualNetworks/subnets', variables('subnetName'))).properties.addressPrefix]

Ausgaben

So geben Sie eine Eigenschaft aus einer Ressource in der Vorlage aus:

output hostname string = publicIP.properties.dnsSettings.fqdn
"outputs": {
  "hostname": {
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  },
}

So geben Sie einen Wert bedingt aus:

output hostname string = condition ? publicIP.properties.dnsSettings.fqdn : ''
"outputs": {
  "hostname": {
    "condition": "[variables('condition')]",
    "type": "string",
    "value": "[reference(resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))).dnsSettings.fqdn]"
  }
}

Der ternäre Bicep-Operator entspricht der if-Funktion im JSON-Code einer ARM-Vorlage, nicht der Eigenschaft „condition“. Die ternäre Syntax muss zu dem einen oder anderen Wert ausgewertet werden. Wenn die Bedingung in den vorherigen Beispielen falsch ist, gibt Bicep einen Hostnamen mit einer leeren Zeichenfolge aus, json gibt jedoch keine Werte aus.

Codewiederverwendung

So trennen Sie eine Lösung in mehrere Dateien:

Nächste Schritte