将json解析为对象ruby
例如,我查看了不同的资源,仍然对如何将json格式解析为自定义对象感到困惑将json解析为对象ruby,ruby,json,Ruby,Json,例如,我查看了不同的资源,仍然对如何将json格式解析为自定义对象感到困惑 class Resident attr_accessor :phone, :addr def initialize(phone, addr) @phone = phone @addr = addr end end 和JSON文件 { "Resident": [ { "phone": "12345", "addr": "xxxxx"
class Resident
attr_accessor :phone, :addr
def initialize(phone, addr)
@phone = phone
@addr = addr
end
end
和JSON文件
{
"Resident": [
{
"phone": "12345",
"addr": "xxxxx"
}, {
"phone": "12345",
"addr": "xxxxx"
}, {
"phone": "12345",
"addr": "xxxxx"
}
]
}
将json文件解析为3个常驻对象的数组的正确方法是什么?需要“json”
require 'json'
class Resident
attr_accessor :phone, :addr
def initialize(phone, addr)
@phone = phone
@addr = addr
end
end
s = '{"Resident":[{"phone":"12345","addr":"xxxxx"},{"phone":"12345","addr":"xxxxx"},{"phone":"12345","addr":"xxxxx"}]}'
j = JSON.parse(s)
objects = j['Resident'].inject([]) { |o,d| o << Resident.new( d['phone'], d['addr'] ) }
p objects[0].phone
"12345"
班级居民
属性访问器:电话,:地址
def初始化(电话、地址)
@电话
@地址=地址
结束
结束
s='{“居民”:[{“电话”:“12345”,“地址”:“xxxxx”},{“电话”:“12345”,“地址”:“xxxxx”},{“电话”:“12345”,“地址”:“xxxxx”}]}'
j=JSON.parse
objects=j['Resident'].inject([]){| o,d | o以下代码更简单:
require 'json'
data = JSON.parse(json_data)
residents = data['Resident'].map { |rd| Resident.new(rd['phone'], rd['addr']) }
今天我在寻找一种可以将json转换为对象的东西,这就像一个符咒:
person = JSON.parse(json_string, object_class: OpenStruct)
这样,如果响应是数组,则可以执行person.education.school
或person[0].education.school
我之所以把它放在这里,是因为它可能对某些人有用。我们最近发布了一个Ruby库static_struct
,它解决了这个问题。如果您使用的是ActiveModel::Serializers::JSON
,您只需从_JSON(JSON)
调用,您的对象就会被映射到这些值
class Person
include ActiveModel::Serializers::JSON
attr_accessor :name, :age, :awesome
def attributes=(hash)
hash.each do |key, value|
send("#{key}=", value)
end
end
def attributes
instance_values
end
end
json = {name: 'bob', age: 22, awesome: true}.to_json
person = Person.new
person.from_json(json) # => #<Person:0x007fec5e7a0088 @age=22, @awesome=true, @name="bob">
person.name # => "bob"
person.age # => 22
person.awesome # => true
班级人员
包含ActiveModel::Serializers::JSON
属性访问器:名称、年龄、真棒
def属性=(散列)
hash.each do |键、值|
发送(“#{key}=”,值)
结束
结束
def属性
实例值
结束
结束
json={name:'bob',年龄:22,awesome:true}.to_json
person=person.new
person.from_json(json)#=>#
person.name#=>“bob”
person.age#=>22
person.awesome#=>真的
将此JSON解析为ruby散列,然后遍历该散列并创建常驻对象。@SergioTulentsev是通过使用JSON.Parse(jsonfile)实现的吗?@SergioTulentsev谢谢我得到了这部分内容,但如何适应新对象?是使用类_变量_定义的还是其他什么?只是一个说明,需要删除“xxxxx”后面的逗号,否则JSON会抱怨。这还不错,但你可以使用可枚举映射#map
来代替每个映射。我添加了我的想法作为答案。这是最好的方法。方便,但不是自定义对象。满足了我的需要。谢谢!