Как преобразовать ключи в ha sh из строк в символы? - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в Ruby. Я пытаюсь импортировать файл и использовать его как переменную в определенном формате.

JSON фрагмент файла (data. json):

[{
    "id": 1,
    "vehicle": "car",
    "options": {
      "doors": "4",
      "make": "Nissan"
      "model": "Altima"
      "year": "2020"
    }
  },
  {
    "id": 2,
    "vehicle": "car",
    "options": {
      "doors": "4",
      "make": "Nissan"
      "model": "Maxima"
      "year": "2020"
    }
  }]

Я пытаюсь чтобы импортировать этот JSON в формате, который выглядит следующим образом:

[{:id=>1, :vehicle=>"car", :options=>{:doors=>"4", :make=>"Nissan", :model=>"Altima", :"year": "2020"}}, {:id=>2, :vehicle=>"car", :options=>{:doors=>"4", :make=>"Nissan", :model=>"Maxima", :"year": "2020"}}]

Я хочу заменить клавиши на символы. Поэтому вместо "id"=>1 я хочу :id=>1. У меня проблемы с преобразованием хэшей опций, потому что они вложены.

В настоящее время у меня есть:

data = File.read("data.json")

, но это не работает.

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Сначала исправьте данные

Сначала исправьте данные JSON. Как было изначально опубликовано, ваш образец ввода не действителен JSON, потому что между параметрами отсутствуют запятые. Исправленный вывод будет следующим:

[{
    "id": 1,
    "vehicle": "car",
    "options": {
      "doors": "4",
      "make": "Nissan",
      "model": "Altima",
      "year": "2020"
    }
  },
  {
    "id": 2,
    "vehicle": "car",
    "options": {
      "doors": "4",
      "make": "Nissan",
      "model": "Maxima",
      "year": "2020"
    }
  }]

Преобразование ключей из строк в символы

Разобрать файл как JSON

После исправления входных данных вы может анализировать данные из вашего файла, используя Kernel # open и JSON # load . Например:

require "json"
vehicles = JSON.load open("data.json")

Transform Keys

Затем вам нужно будет преобразовать ваши ключи, используя Hash # transform_keys! и String # to_sym . Например:

vehicles.map do |hash|
  # convert top-level keys from String to Symbol
  hash.transform_keys! { |key| key.to_sym }

  # convert top-level keys in options hash
  hash[:options].transform_keys! { |key| key.to_sym }
end

Довольно печатаемый автомобили теперь выдаст следующее:

pp vehicles

[{:id=>1,
  :vehicle=>"car",
  :options=>{:doors=>"4", :make=>"Nissan", :model=>"Altima", :year=>"2020"}},
 {:id=>2,
  :vehicle=>"car",
  :options=>{:doors=>"4", :make=>"Nissan", :model=>"Maxima", :year=>"2020"}}]

Предостережения

Это решение обрабатывает любое количество ключи на верхнем уровне каждого ha sh и любое количество ключей верхнего уровня в каждом параметре ha sh, но не обрабатывает никакого вложения сверх этого. Если у вас есть нерегулярные JSON объекты с произвольными уровнями вложенных хэшей, вам может потребоваться пройти ha sh на необходимую глубину с помощью других средств.

0 голосов
/ 10 июля 2020

File.read только читает файл в строку, но не анализирует содержимое как json.

require 'json'
file = File.read('data.json')
data = JSON.parse(file)
...