从瑞典统计局下载数据。查询中的瑞典语字符

Chr*_*anL 5 r httr

我设法使用网站 api 从瑞典统计局检索了一些数据。这个问题的答案解决了我的大部分问题。

如何以不太详细的方式发布 JSON 格式的请求以从 R 中的 URL 获取 JSON 数据到 data.frame 中?

但我仍然有两个问题。

如果我的 json 问题中有带有变音符号的字符(如“Å”、“Ä”、“Ö”),我会从服务器收到“404”响应。

我正在尝试从此表下载数据:

按地区、就业、年龄和性别划分的 16 岁以上人口 (RAMS)。2004 - 2015 年

(点击“Continue”,然后点击“api for this table”就可以查询到网站上的api,但是必须把响应格式从“px”改为“json”。)

此代码有效:

library(jsonlite)
library(httr)

bodytxt <- '{
  "query": [
{
  "code": "Region",
  "selection": {
  "filter": "vs:RegionKommun07",
  "values": [
  "0114",
  "1280"
  ]
  }
},
  {
  "code": "Alder",
  "selection": {
  "filter": "item",
  "values": [
  "16-19"
  ]
  }
  },
  {
  "code": "Tid",
  "selection": {
  "filter": "item",
  "values": [
  "2015"
  ]
  }
  }
  ],
  "response": {
  "format": "json"
  }
  }'


req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
            body = bodytxt, encode = "json")

stop_for_status(req)
json <- content(req, "text")


# JSON starts with an invalid character:
validate(json)
json <- substring(json, 2)
validate(json)

# Now we can parse
object <- fromJSON(json)
print(object)
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改查询以使其包含“Ö”,则它不起作用。例子:

bodytxt <- '{
  "query": [
    {
      "code": "Region",
      "selection": {
        "filter": "vs:RegionKommun07",
        "values": [
          "0114",
          "1280"
          ]
      }
    },
    {
      "code": "Sysselsattning",
      "selection": {
        "filter": "item",
        "values": [
          "FÖRV"
          ]
      }
    },
    {
      "code": "Alder",
      "selection": {
        "filter": "item",
        "values": [
          "16-19"
          ]
      }
    },
    {
      "code": "Tid",
      "selection": {
        "filter": "item",
        "values": [
          "2015"
          ]
      }
    }
    ],
  "response": {
    "format": "json"
  }
}'
Run Code Online (Sandbox Code Playgroud)

我遇到的另一个问题是,据我所知,应该可以将 json 查询更改为列表并将该列表包含在对服务器的调用中,但是我收到了“404”错误。例子:

body_list <- fromJSON(bodytxt)
req <- POST("http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK",
            body = body_list, encode = "json")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

附!我知道它在 CRAN 上存在一个名为 pxweb 的优秀包,它非常容易用于从瑞典统计局下载数据。但是我想学习 api 并且 pxwed 不允许我跳过查询中的维度。

系统:Windows 7,以utf-8编码保存的r脚本。

hrb*_*str 4

尝试使用这些参数fromJSON()

\n\n
library(httr)\nlibrary(jsonlite)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您的数据:

\n\n
bodytxt <- \'{\n  "query": [\n    {\n      "code": "Region",\n      "selection": {\n        "filter": "vs:RegionKommun07",\n        "values": [\n          "0114",\n          "1280"\n          ]\n      }\n    },\n    {\n      "code": "Sysselsattning",\n      "selection": {\n        "filter": "item",\n        "values": [\n          "F\xc3\x96RV"\n          ]\n      }\n    },\n    {\n      "code": "Alder",\n      "selection": {\n        "filter": "item",\n        "values": [\n          "16-19"\n          ]\n      }\n    },\n    {\n      "code": "Tid",\n      "selection": {\n        "filter": "item",\n        "values": [\n          "2015"\n          ]\n      }\n    }\n    ],\n  "response": {\n    "format": "json"\n  }\n}\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

修改后的fromJSON()换算:

\n\n
query <- jsonlite::fromJSON(bodytxt,\n                            simplifyVector=FALSE,\n                            simplifyDataFrame=FALSE)\n
Run Code Online (Sandbox Code Playgroud)\n\n

您拨打的电话相同(为了我的利益而添加verbose(),但您可以将其删除):

\n\n
URL <- "http://api.scb.se/OV0104/v1/doris/en/ssd/START/AM/AM0207/AM0207H/BefSyssAldKonK"\nreq <- POST(URL, body=query, encode="json", verbose())\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果:

\n\n
content(req, simplifyDataFrame=TRUE)\n\n## Warning: JSON string contains (illegal) UTF8 byte-order-mark!\n\n## $columns\n##             code                        text type\n## 1         Region                      region    d\n## 2 Sysselsattning           employment status    d\n## 3          Alder                         age    d\n## 4            Tid                        year    t\n## 5       AM0207F2 Population 16+ years (RAMS)    c\n## \n## $comments\n## list()\n## \n## $data\n##                       key values\n## 1 0114, F\xc3\x96RV, 16-19, 2015    379\n## 2 1280, F\xc3\x96RV, 16-19, 2015   1443\n
Run Code Online (Sandbox Code Playgroud)\n\n

该警告是由于 API 服务器正在将字节顺序标记与结果一起发送回来的事实(它是 Microsoft 服务器,因此在涉及到此问题时他们有点脑死亡)。(内部进行转换的jsonlite位)可以处理它。content()

\n