如何在没有格式化的新行、回车、制表符等的情况下获得带有curl的json对象,就像一行一样



我想从Google Direction API获取一个JSON对象。Google API响应的格式为JSON,并带有如下换行符:

{
geocoded_waypoints: [
{
geocoder_status: "OK",
place_id: "ChIJpws0Ra-DnkcRHLPUqU7qpiM",
types: [
"route"
]
}
]
}

但我需要一行的响应,没有格式。

我可以用卷发做这个吗?我下载了最新版本。

我还试过这个:

  1. 此版本将每一行放在数据库中的一行中

    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=***"';
    
  2. 原因错误:

    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的jqsedtr的管道。跨越进程边界总是有可能破坏Unicode数据
    • 如果服务器本身在JSON中返回文字Unicode字符,它们也会被转换为u....
    • PowerShell在每台Windows计算机上都可用,必须首先安装其他工具
  • 如果您可以升级PowerShell版本,则可以删除regex部分,转而使用ConvertTo-JSON -EscapeHandling EscapeNonAscii

相关内容

  • 没有找到相关文章

最新更新