我想从Google Direction API获取一个JSON对象。Google API响应的格式为JSON,并带有如下换行符:
{
geocoded_waypoints: [
{
geocoder_status: "OK",
place_id: "ChIJpws0Ra-DnkcRHLPUqU7qpiM",
types: [
"route"
]
}
]
}
但我需要一行的响应,没有格式。
我可以用卷发做这个吗?我下载了最新版本。
我还试过这个:
此版本将每一行放在数据库中的一行中
COPY "routing_import_gm" ("request") FROM PROGRAM 'curl "https://maps.googleapis.com/maps/api/directions/json?origin=48.xxxxxx,+11.yyyyyy&destination=48.xxxxxx,+11.yyyyyyy&key=***"';
原因错误:
COPY "routing_import_gm" ("request") FROM PROGRAM 'curl "https://maps.googleapis.com/maps/api/directions/json?origin=48.xxxxxx,+11.yyyyyy&destination=48.xxxxxx,+11.yyyyyyy&key=***" | tr -d ''n'' ';
以下PowerShell命令从给定的URL加载任何格式的JSON数据,并输出一行JSON作为结果:
Invoke-RestMethod "https://your/url" | ConvertTo-Json -Compress -Depth 10
Invoke-RestMethod
期望JSON响应,并将其解码为数据结构ConvertTo-Json
获取一个数据结构并将其转换为JSON。- CCD_ 3跳过所有缩进和所有换行
-Depth
设置最大嵌套级别(默认情况下只有2,对您的数据来说不够(
您可以使用以下命令运行PowerShell:
powershell -NoLogo -NonInteractive -Command "..."
你可以在COPY
语句中使用它。
COPY "routing_import_gm" ("request")
FROM PROGRAM 'powershell -NoLogo -NonInteractive -Command "Invoke-RestMethod "https://your/url" | ConvertTo-Json -Compress -Depth 10"';
您说Unicode字符有问题。在这个设置中,这是一个相当棘手的问题。有两个问题:
- 它需要在多个位置进行正确的配置,才能为shell命令获取Unicode字符。这在技术上是可能的,但设置它是一个巨大的痛苦
- JSON提供了一种ASCII兼容格式,将所有Unicode字符编码为
u....
。这会回避问题,但PowerShell 5.1中的ConvertTo-JSON
(您已经拥有(本机并没有提供这一功能。-EscapeHandling
参数(用于执行此操作(需要PowerShell 6.2
我们依赖ConvertTo-JSON
将传入的JSON格式化为一行,而且我们不能简单地更改您的PowerShell版本。一种可能的解决方法是使用regex:将所有非ASCII字符替换为u....
字符代码
[regex]::Replace($json, '[^x00-x7f]', {param($m) 'u{0:X4}'-f[int][char]$m[0].value})
如果$json
是'{"test": "Smørrebrød 🥪"}'
,那么上面的返回'{"test": "Smu00F8rrebru00F8d uD83EuDD6A"}'
,它既是有效的JSON,也是ASCII,所以它不会给您带来任何COPY FROM PROGRAM的麻烦。
应用于上面的代码,我们最终会得到:
powershell -NoLogo -Command "$json = Invoke-RestMethod 'https://your/url' | ConvertTo-Json -Compress -Depth 10; [regex]::Replace($json, '[^x00-x7f]', {param($m) 'u{0:X4}'-f[int][char]$m[0].value})"
票据
- 虽然所有这些都很复杂,但使用PowerShell的优点是
- 所有这些(请求URL、从响应中获取JSON、转换它(都支持Unicode,并且从不跨越进程边界,例如,从适用于Windows的
curl
到适用于Windows的jq
、sed
或tr
的管道。跨越进程边界总是有可能破坏Unicode数据 - 如果服务器本身在JSON中返回文字Unicode字符,它们也会被转换为
u....
- PowerShell在每台Windows计算机上都可用,必须首先安装其他工具
- 所有这些(请求URL、从响应中获取JSON、转换它(都支持Unicode,并且从不跨越进程边界,例如,从适用于Windows的
- 如果您可以升级PowerShell版本,则可以删除regex部分,转而使用
ConvertTo-JSON -EscapeHandling EscapeNonAscii