1

私は YAML ファイルを扱っています。それをハッシュに変換すると、値の 1 つが文字列になります。

これは私が扱っているドキュメントです:

---
    http_interactions:
    - request:
        method: post
        uri: http://********/client/api
        body:
          encoding: US-ASCII
          string: *******************
        headers: {}

      response:
        status:
          code: 200
          message: OK
        headers:
          Date:
          - Mon, 24 Sep 2012 10:38:01 GMT
          Set-Cookie:
          - ***************; Path=/client
          Content-Type:
          - text/javascript;charset=UTF-8
          Content-Length:
          - "425"
        body:
          encoding: ASCII-8BIT
          string: >
            {
              "loginresponse": {
                "timeout": "43200",
                "lastname": "frgrg",
                "registered": "false",
                "username": "rfrfr",
                "timezone": "America\/New_York",
                "firstname": "Mrfrfronika ",
                "domainid": "3434444444444444444",
                "type": "0",
                "userid": "4444444444444444444444444444444441",
                "sessionkey": "ewrffffffffffffffffffffff",
                "timezoneoffset": "-4.0",
                "account": "dddd"
              }
            }
        http_version:
      recorded_at: Mon, 24 Sep 2012 10:38:01 GMT
    recorded_with: VCR 2.2.5

これは私がファイルを操作する方法です:

thing = YAML.load_file('login_as_user.yml')

http = thing['http_interactions']

alldoc = http[0]
response = alldoc['response']
body = response['body']
bodystring = body['string']

文字列はbodyキーの値であり、本文に出力すると、次のように返されます。

puts body

体:

{"encoding"=>"ASCII-8BIT", "string"=>"{\n  \"loginresponse\": {\n    \"timeout\": \"43200\",\n    \"lastname\": \"sdsd\",\n    \"registered\": \"false\",\n    \"username\": \"sdsdsd\",\n    \"timezone\": \"America\\/New_York\",\n    \"firstname\": \"sdasdas \",\n    \"domainid\": \"ssssssssssss\",\n    \"type\": \"0\",\n    \"userid\": \"ssssssssssss1\",\n    \"sessionkey\": \"sssssssssss",\n    \"timezoneoffset\": \"-4.0\",\n    \"account\": \"sadsadsa\"\n  }\n}\n"}

しかし、この文字列の値を次のように確認すると:

puts bodystring

それは適切にフォーマットされます:

{
  "loginresponse": {
  "timeout": "43200",
  "lastname": "wwd",
  "registered": "false",
  "username": "dddd",
  "timezone": "America\/New_York",
  "firstname": "dddd ",
  "domainid": "dddfdfdf",
  "type": "0",
  "userid": "dfsdfdsf",
  "sessionkey": "dsfdsfdsf",
  "timezoneoffset": "-4.0",
  "account": "dsfdsfdsfd"
 }
}

したがって、問題はエスケープされたシンボルにあり、データを操作した後、ファイルを開いて再度書き込むと、フォーマットが間違っています。

誰かが私を助けてくれれば幸いです。

4

1 に答える 1

1

本文は単なる文字列ですが、その文字列はハッシュの JSON エンコーディングです。その JSON エンコーディングを Ruby ハッシュに変換するには、json gemを使用します。

require 'json'
body_hash = JSON.parse(bodystring)

Rails を使用している場合は、おそらく既に json gem が読み込まれており、require.

于 2012-11-12T12:53:18.587 に答える