如何从双重嵌套响应中解析 JSON
How To Parse JSON From Doubly Nested Response
如果我收到 cars
端点的 JSON 响应:
{
data: {
cars: [
{ make: "Tesla", model: "S" }
]
}
}
我有一个 class Car
:
class Car
JSON.mapping(
make: String,
model: String
)
end
我如何解析响应以便根下移两级?我知道我可以 Car.from_json(json_string, "data")
,但找不到指定另一个根键的方法。
如果没有办法做到这一点,如果不为 cars
级别创建另一个 class,最简单的方法是什么?
您可以在此处采用多种方法。
一个简单但效率最低的方法是只解析两次:
cars = Array(Car).from_json(JSON.parse(json)["data"]["cars"].to_json)
然后正如您提到的,您可以只为外部 类 创建映射。与您所拥有的相比,没有真正更快的方法:
class Root
JSON.mapping(data: Data)
end
class Data
JSON.mapping(cars: Array(Car))
end
class Car
JSON.mapping(
make: String,
model: String
)
end
cars = Root.from_json(json).data.cars
或者如果您更喜欢使用 JSON::Serializable
API:
class Root
include JSON::Serializable
property data : Data
end
class Data
include JSON::Serializable
property cars : Array(Car)
end
class Car
include JSON::Serializable
property make : String
property model : String
end
cars = Root.from_json(json).data.cars
最后一个方法是直接驱动JSON::PullParser
API:
parser = JSON::PullParser.new(json)
cars = nil
parser.on_key("data") do
parser.on_key("cars") do
cars = Array(Car).new(parser)
end
end
如果我收到 cars
端点的 JSON 响应:
{
data: {
cars: [
{ make: "Tesla", model: "S" }
]
}
}
我有一个 class Car
:
class Car
JSON.mapping(
make: String,
model: String
)
end
我如何解析响应以便根下移两级?我知道我可以 Car.from_json(json_string, "data")
,但找不到指定另一个根键的方法。
如果没有办法做到这一点,如果不为 cars
级别创建另一个 class,最简单的方法是什么?
您可以在此处采用多种方法。
一个简单但效率最低的方法是只解析两次:
cars = Array(Car).from_json(JSON.parse(json)["data"]["cars"].to_json)
然后正如您提到的,您可以只为外部 类 创建映射。与您所拥有的相比,没有真正更快的方法:
class Root
JSON.mapping(data: Data)
end
class Data
JSON.mapping(cars: Array(Car))
end
class Car
JSON.mapping(
make: String,
model: String
)
end
cars = Root.from_json(json).data.cars
或者如果您更喜欢使用 JSON::Serializable
API:
class Root
include JSON::Serializable
property data : Data
end
class Data
include JSON::Serializable
property cars : Array(Car)
end
class Car
include JSON::Serializable
property make : String
property model : String
end
cars = Root.from_json(json).data.cars
最后一个方法是直接驱动JSON::PullParser
API:
parser = JSON::PullParser.new(json)
cars = nil
parser.on_key("data") do
parser.on_key("cars") do
cars = Array(Car).new(parser)
end
end