I was not able to find a post that succinctly demonstrated this, so I wanted to share my solution here. I was trying to deploy a .NET Core web application with some app settings inside an ARM template. The app settings are contained as an object with nested properties, like so:

"AzureStorageConfig":{
   "AccountName":"this-is-a-dummy-value",
   "AccountKey":"this-is-a-dummy-value",
   "ImageContainer":"this-is-a-dummy-value",
   "ThumbnailContainer":"this-is-a-dummy-value"
}

Here is what that resource looks like, in my ARM template, paying attention to the highlighted settings:

{
   "name":"appsettings",
   "type":"config",
   "apiVersion":"2018-11-01",
   "dependsOn":[
      "[resourceId('Microsoft.Web/sites', variables('sites_sample_aspnet_name'))]",
      "[resourceId('Microsoft.Insights/components', variables('sample_aspnet_appinsights_name'))]"
   ],
   "properties":{
      "AzureStorageConfig__AccountName":"[variables('storageAccount_name')]",
      "AzureStorageConfig__ImageContainer":"this-is-a-dummy-value",
      "AzureStorageConfig__ThumbnailContainer":"this-is-a-dummy-value",
      "AzureStorageConfig__AccountKey":"[concat('@Microsoft.KeyVault(SecretUri=', reference(resourceId('Microsoft.KeyVault/vaults/secrets', variables('keyvault_name'), parameters('keyvaultAccessKeySecretName'))).secretUriWithVersion,')')]",
      "APPINSIGHTS_INSTRUMENTATIONKEY":"[reference(resourceId('Microsoft.Insights/components', variables('sample_aspnet_appinsights_name')), '2014-04-01').InstrumentationKey]"
   }
}

The double underscore value, indicates a nested property, while the prefix before the double underscore indicates the object name. Thus, the property “AccountName” on the object “AzureStorageConfig”, becomes AzureStorageConfig__AccountName in the ARM template.