如何让 ruby 中的 RestClient 正确格式化带有特殊字符的响应?

How do I get RestClient in ruby to properly format responses with special characters?

我有一组对象要发送到 REST API 以接收有关这些对象的信息。为此,我使用带有以下行的 RestClient 来发送调用和解析响应。

response_raw = RestClient.get "http://#{re_host}:#{re_port}/reachengine/api/inventory/search?rql=fCSAssetNumber=#{fcs_id_num}%20size%20#{size}%20&apiKey=#{api_key}", headers
 response_json = Crack::JSON.parse(response_raw)
 response_json['results'].each do |result|

对于我执行此操作的前 20 多条记录,一切正常。然后我开始得到一个 NoMethodError: undefined method `[]' for nil:NilClass

当我运行代码在IRB中一步步执行的时候,看到的结果很奇怪

result = response_json['results'][0]
>=> {"name"=>"Publicaciòn_Listin_Diario.png", " id"=>" 294290", " dateCreated"=>" 2015-09-20T20:35:06.000+0000", " dateUpdated"=>" 2015-12-23T19:33:13.000+0000", " systemKeywords"=>" Publicaciòn_Listin_Diario.png Image ", "t humbnailId"=>"4 24725", "m etadata"=>{" sourceFilePath"=>"/ Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png", "pa MdCustAgency_picklist_sortable"=>"nul l", "th umbnailAssetFlag"=>"fal se", "re storeKey"=>"nul l", "ar chiveStatus_picklist_sortable"=>"nul l", "fC SAssetNumber"=>"18 2725", "fC SMetadataSet"=>"Ra w Graphic", "cu stKeywords"=>"Do minican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show", "cu stAssetStatus_picklist_sortable"=>"nul l", "se archableFlag"=>"fal se", "as setType"=>"Im age", "pa MdCustHerbalifeJobNumber"=>"13 07001", "da teCreated"=>"20 15-09-20T20:35:06", "da teLocked"=>"nul l", "uu id"=>"30 9d9bb3-6935-4ab6-a04a-ef7264132bc6", "ve rsionFlag"=>"nul l", "ag ency_picklist_sortable"=>"nul l", "pr oducer_picklist_sortable"=>"nul l", "tr uncatedFlag"=>"fal se", "cu stDescription"=>"*R aw Graphics for 1307001_August_2013_KOS"}, "in ventoryKey"=>"im age"}

通常,有了这个回复,我可以运行 结果['metadata']['fCSAssetNumber']

但是;由于随机空格,这失败了 "NoMethodError: undefined method `[]' for nil:NilClass" 因为字符串不是 'metadata' 它实际上是 'm etadata'

所有这一切真的很奇怪,为什么这是一个 Ruby 问题而不是轻易确定是 API 的问题是通过 Postman REST Client 在chrome returns 这个结果:

>{
  "results": [
    {
      "name": "Publicaciòn_Listin_Diario.png",
      "id": "294290",
      "dateCreated": "2015-09-20T20:35:06.000+0000",
      "dateUpdated": "2015-12-23T19:33:13.000+0000",
      "systemKeywords": "Publicaciòn_Listin_Diario.png Image ",
      "thumbnailId": "424725",
      "metadata": {
        "sourceFilePath": "/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png",
        "paMdCustAgency_picklist_sortable": null,
        "thumbnailAssetFlag": false,
        "restoreKey": null,
        "archiveStatus_picklist_sortable": null,
        "fCSAssetNumber": "182725",
        "fCSMetadataSet": "Raw Graphic",
        "custKeywords": "Dominican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show",
        "custAssetStatus_picklist_sortable": null,
        "searchableFlag": false,
        "assetType": "Image",
        "paMdCustHerbalifeJobNumber": "1307001",
        "dateCreated": "2015-09-20T20:35:06",
        "dateLocked": null,
        "uuid": "309d9bb3-6935-4ab6-a04a-ef7264132bc6",
        "versionFlag": null,
        "agency_picklist_sortable": null,
        "producer_picklist_sortable": null,
        "truncatedFlag": false,
        "custDescription": "*Raw Graphics for 1307001_August_2013_KOS"
      },
      "inventoryKey": "image"
    }
  ],
  "total": "1"
}

广告您可以在上面看到,当 Postman 运行 发出完全相同的呼叫时,响应没有问题,但是当 ruby 运行 发出呼叫时,响应就会出现问题。另请注意,这不会一直发生。

下面是来自同一 ruby 调用的实际响应示例。

result = response_json['results'][0]
=> {"name"=>"Marco_1er_dia.png", "id"=>"294284", "dateCreated"=>"2015-09-`20T20:34:54.000+0000", "dateUpdated"=>"2015-12-23T19:33:10.000+0000", "systemKeywords"=>"Marco_1er_dia.png Image ", "thumbnailId"=>"424716", "metadata"=>{"sourceFilePath"=>"/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Marco_1er_dia.png", "paMdCustAgency_picklist_sortable"=>nil, "collectionMemberships"=>"320 321", "thumbnailAssetFlag"=>false, "restoreKey"=>nil, "fCSMetadataSet"=>"Raw Graphic", "fCSAssetNumber"=>"182722", "archiveStatus_picklist_sortable"=>nil, "custAssetStatus_picklist_sortable"=>nil, "custKeywords"=>"1307001 August 2013 KOS Kickoff show, Dominican Republic Cycling Team", "searchableFlag"=>false, "assetType"=>"Image", "paMdCustHerbalifeJobNumber"=>"1307001", "dateCreated"=>"2015-09-20T20:34:54", "dateLocked"=>nil, "uuid"=>"b5e55c14-b94e-4629-9e2a-61a2dc0876f6", "versionFlag"=>nil, "fCSProductionStatus_picklist_sortable"=>nil, "agency_picklist_sortable"=>nil, "producer_picklist_sortable"=>nil, "truncatedFlag"=>false, "custDescription"=>"*Raw Graphics for 1307001_August_2013_KOS"}, "inventoryKey"=>"image"}`

请注意上面的响应如何没有间距问题?我在这里看到的唯一明显区别是文件名中使用了一个特殊字符:ò 我需要做些什么才能让 RESTClient 处理这个问题吗?

有人知道如何解决这个问题吗?

此问题与 'crack' gem 有关。我已经用了很长时间了。显然,从 Ruby 1.9 开始,parse 方法已经在标准 JSON class 上可用。当我通过更改

切换到使用它时
response_json = Crack::JSON.parse(response_raw)

response_json = JSON.parse(response_raw)

问题已解决。