2016-09-14 7 views
2

У меня есть следующие JSON:Параметризованная JSON ключ именования

{ 
    my_json: { 
    id: 1, 
    name: "John" 
    } 
} 

Как настроить имя ключа с помощью параметрироваться как:

def jsonize(custom_key="id") 
{ 
    my_json: { 
     "#{custom_key}": 1, 
     name: "John" 
    } 
    } 
end 

Для выхода с:

Сценарий 1:

=> jsonize 

OUTPUT:

{ 
    my_json: { 
    id: 1, 
    name: "John" 
    } 
} 

Сценарий 2:

=> jsonize("value") 

ВЫВОД:

{ 
    my_json: { 
    value: 1, 
    name: "John" 
    } 
} 
+2

Вы код будете работать и это верно. –

+0

Это опечатка? '" # {custome_key} ": 1,' должно быть как '" # {custom_key} ": 1,'. –

+0

Привет @GokulM, спасибо за указание опечатки. Но это не то, что я имел в виду. Когда я запускаю метод, он выдает ошибку «синтаксическая ошибка, неожиданная»: «, ожидая => « # {custome_key} »: 1,' потому что она не должна быть построена так. Вопрос в том, могу ли я выполнить параметризацию имен ключей? :) – araratan

ответ

0

Вы можете просто преобразовать его в symbol и использовать hash_rocket синтаксис вы получите ожидаемый результат

def jsonize(custom_key = "id") 
    { 
    my_json: { 
     custom_key.to_sym => 1, 
     name: "John" 
    } 
    } 
end 

#=> jsonize('foo') 
#=> { 
#=>  :my_json => { 
#=>   :foo => 1, 
#=>   :name => "John" 
#=>  } 
#=> } 
+0

Спасибо! Это правильно! – araratan

1

Вы можете использовать ":" отделить символические ключи и значения, использование "=>" в вашем примере:

def jsonize(custom_key="id") 
{ 
    my_json: { 
     "#{custom_key}" => 1, 
     name: "John" 
    } 
    } 
end 
+0

Спасибо! Это правильно, но я должен выбрать ответ, чтобы принять его. Поэтому я просто проголосую за ваш ответ. – araratan

1

Синтаксис хэша-ракета был в Рубине с древних времен:

{ :foo => 1, "bar" => 2 } 

Ruby 1.9 (я думаю) ввел новое двоеточие ярлыка только для символов (при сохранении генерала хэша-ракетного для любого типа ключа):

{ foo: 1, "bar" => 2 } 

рубин 2,2 (я думаю) введена возможность символизирующей строки в этот синтаксис:

{ "foo": 1, "bar" => 2 } 

Все они делают то же самое. То, что вы делаете, - это совершенно грамматический код Ruby - в достаточно новом Ruby.В старых рубины, вам нужно будет использовать старый надежный хэш-ракетную синтаксис:

{ "foo".to_sym => 1, "bar" => 2 } 

Теперь, когда вы на самом деле есть строка, вы можете сделать нормальный интерполяции:

{ "f#{'o' * 2}".to_sym => 1, "bar" => 2 } 

В вашем случае, вы может написать

{ "#{custom_key}".to_sym => 1 } 

Однако все это совершенно не нужно, так как вы можете просто написать просто так, в любой Ruby:

{ custom_key.to_sym => 1 } 

Еще лучше, так как вы просто переворачивая все в формате JSON сразу после того, как, вы даже не нужно символизировали клавиши; так что эти два выражения будут иметь одинаковые результаты:

{ custom_key.to_sym => 1 }.to_json 
{ custom_key => 1 }.to_json 

(Также обратите внимание на то, что вы утверждаете в качестве примеров JSON - вход и выход - это, по сути, не JSON, ни бы .to_json выход типа В JSON, в отличие от простого текстового объекта JavaScript, ключи должны быть указаны в, и именно так будет производиться to_json. Однако ваш ввод является рубиновым хэш-символом Ruby.)

+0

Спасибо за прекрасное объяснение! – araratan