PowerShell中Curl命令处理JSON报错问题求助
解决PowerShell中curl发送JSON到Elasticsearch的格式错误问题
这个报错Unexpected character ('D' (code 68)): was expecting double-quote to start field name其实指向很明确——Elasticsearch收到的JSON格式不合法,字段名没被双引号包裹,大概率是你在PowerShell里处理JSON数据的环节出了问题,我给你拆解下解决方案:
核心问题:哈希表没转成标准JSON
你定义的$elasticdata是PowerShell的哈希表对象,直接传给curl的话,PowerShell会把它转换成自己的字符串格式(比如@{timereceived=test; timesent=testing; ...}),这根本不是Elasticsearch能识别的JSON格式,必须先把哈希表转成标准JSON字符串。
修正后的完整代码示例
$curlExe = "h:\powershell\esb\elastic\curl\curl.exe" $elasticdata = @{ timereceived = "test" timesent = "testing" name = "anon" status = 0 } # 关键步骤:把哈希表转换成合法JSON $jsonPayload = $elasticdata | ConvertTo-Json # 调用curl发送请求,注意用--data-raw避免PowerShell的引号解析问题 & $curlExe -X POST "http://你的Elasticsearch地址:9200/目标索引/_doc" ` -H "Content-Type: application/json" ` --data-raw $jsonPayload
额外的坑点排查
- 嵌套结构的JSON深度问题:如果你的哈希表有多层嵌套,默认
ConvertTo-Json只处理2层,会导致JSON截断,需要加-Depth参数,比如:$jsonPayload = $elasticdata | ConvertTo-Json -Depth 10 - 先验证JSON合法性:可以先输出
$jsonPayload看看是不是标准格式:
正常应该输出类似这样的内容:Write-Output $jsonPayload{ "timereceived": "test", "timesent": "testing", "name": "anon", "status": 0 } - 改用PowerShell原生命令更省心:其实PowerShell自带
Invoke-RestMethod,完全可以替代curl,避免命令行参数的解析麻烦:$elasticdata = @{ timereceived = "test" timesent = "testing" name = "anon" status = 0 } $jsonPayload = $elasticdata | ConvertTo-Json Invoke-RestMethod -Uri "http://你的Elasticsearch地址:9200/目标索引/_doc" ` -Method Post ` -Body $jsonPayload ` -ContentType "application/json"
内容的提问来源于stack exchange,提问作者Ian Ramsden
相关产品推荐
相关产品推荐

