用于注册架构的命令:
curl -i -XPOST -u "accesskey:secretkey" -H "Content-Type: application/vnd.schemaregistry.v1+json" https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions --data '{ "schema": "{""type"":""record"",""name"":""ShipmentNotification"",""namespace"":""com.x.ordertrackinginfo.eventschema"",""fields"":[{""name"":""sellingStoreNumber"",""type"":""int""}}'
错误:
意外字符("(代码 39)):应为有效值(JSON 字符串、数字、数组、对象或令牌"null"、"true"或"false") 在 [来源: (org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream); 行: 1, 列: 2]卷曲: (6) 无法解析主机:架构 卷曲:(3) [通配] 第 115 列中的嵌套大括号
注意:此答案假设你从 PowerShell 调用,并且你正在尝试嵌套JSON,并且你的 JSON 组成如下:
-
单一的顶级
schema
属性 -
其值是恰好也包含 JSON 的单个字符串。
如果您从bash
(或类似)调用,您需要做的就是将所有""
替换为'...'
字符串中的"
,并在最后}
之前插入一个"
。
tl;dr,从PowerShell 7.1开始:
curl -i -XPOST -u "accesskey:secretkey" `
-H "Content-Type: application/vnd.schemaregistry.v1+json" `
https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions `
--data (@'
{ "schema": "{"type":"record","name":"ShipmentNotification","namespace":"com.x.ordertrackinginfo.eventschema","fields":[{"name":"sellingStoreNumber","type":"int"}" }
'@ -replace '([\]*)"', '$1$1"')
请注意,在行尾使用`
以便继续下一行的命令(纯粹是为了可读性),并且结束'@
分隔符必须是该行的第一个字符。
分步说明:
首先,根据 JSON 的要求,使用 PowerShell 中的逐字 here-string 单独创建此 JSON 字符串(尽管常规逐字字符串'...'
可以),"
作为属性值一部分的字符(而不是具有语法函数的字符)作为 JSON 的要求转义为"
:
$json = @'
{
"schema": "{"type":"record","name":"ShipmentNotification","namespace":"com.x.ordertrackinginfo.eventschema","fields":[{"name":"sellingStoreNumber","type":"int"}"
}
'@
生成的字符串是有效的 JSON,您可以使用$json | ConvertFrom-Json
接下来,必须应用其他转义才能将字符串传递给外部程序:
- 注意:
- 这种额外的转义应该永远没有必要,但至少要到 PowerShell 版本 7.1(撰写本文时的当前版本)。
- 可以配置 v7.2 预览版本中的实验性功能来解决此问题,因此不再需要此步骤。
- 有关背景信息和详细信息,请参阅此答案。
$jsonEscapedForExternalProgram = $json -replace '([\]*)"', '$1$1"'
现在您可以将转义的 JSON 字符串传递给外部curl
程序(在 Windows 上curl.exe
):
curl -i -XPOST -u "accesskey:secretkey" `
-H "Content-Type: application/vnd.schemaregistry.v1+json" `
https://schema-registry.nonprod.us-west-2.aws.proton.x.com/subjects/tracking-info-publish-avro-value/versions `
--data $jsonEscapedForExternalProgram
我遇到了同样的问题。我的解决方案是只使用带有正确标头的邮递员,并仅使用架构属性发送 json,如下所述: https://docs.confluent.io/platform/current/schema-registry/develop/api.html#schemaregistry-api
你可以像这样使用一个 json:
{ "schema": "{ "type": "record", "name": "test", "fields": [ { "type": "string", "name": "field1" }, { "type": "int", "name": "field2" } ] }" }
该 json 取自文档。