Public Instance methods
Parse the provided JSON, which should return a hash, and process the hash with from_json_node.
# File lib/sequel/plugins/json_serializer.rb 221 def from_json(json, opts=OPTS) 222 from_json_node(Sequel.parse_json(json), opts) 223 end
Using the provided hash, update the instance with data contained in the hash. By default, just calls set with the hash values.
Options:
:associations |
Indicates that the associations cache should be updated by creating a new associated object using data from the hash. Should be a |
:fields |
Changes the behavior to call set_fields using the provided fields, instead of calling set. |
# File lib/sequel/plugins/json_serializer.rb 234 def from_json_node(hash, opts=OPTS) 235 unless hash.is_a?(Hash) 236 raise Error, "parsed json doesn't return a hash" 237 end 238 239 populate_associations = {} 240 241 if assocs = opts[:associations] 242 assocs = case assocs 243 when Symbol 244 {assocs=>OPTS} 245 when Array 246 assocs_tmp = {} 247 assocs.each{|v| assocs_tmp[v] = OPTS} 248 assocs_tmp 249 when Hash 250 assocs 251 else 252 raise Error, ":associations should be Symbol, Array, or Hash if present" 253 end 254 255 assocs.each do |assoc, assoc_opts| 256 if assoc_values = hash.delete(assoc.to_s) 257 unless r = model.association_reflection(assoc) 258 raise Error, "Association #{assoc} is not defined for #{model}" 259 end 260 261 populate_associations[assoc] = if r.returns_array? 262 raise Error, "Attempt to populate array association with a non-array" unless assoc_values.is_a?(Array) 263 assoc_values.map{|v| v.is_a?(r.associated_class) ? v : r.associated_class.new.from_json_node(v, assoc_opts)} 264 else 265 raise Error, "Attempt to populate non-array association with an array" if assoc_values.is_a?(Array) 266 assoc_values.is_a?(r.associated_class) ? assoc_values : r.associated_class.new.from_json_node(assoc_values, assoc_opts) 267 end 268 end 269 end 270 end 271 272 if fields = opts[:fields] 273 set_fields(hash, fields, opts) 274 else 275 set(hash) 276 end 277 278 populate_associations.each do |assoc, values| 279 associations[assoc] = values 280 end 281 282 self 283 end
Set the json serialization options that will be used by default in future calls to to_json
. This is designed for cases where the model object will be used inside another data structure which to_json
is called on, and as such will not allow passing of arguments to to_json
.
Example:
obj.json_serializer_opts(only: :name) [obj].to_json # => '[{"name":"..."}]'
# File lib/sequel/plugins/json_serializer.rb 295 def json_serializer_opts(opts=OPTS) 296 @json_serializer_opts = (@json_serializer_opts||OPTS).merge(opts) 297 end
Return a string in JSON format. Accepts the following options:
:except |
|
:include |
|
:only |
|
:root |
Qualify the JSON with the name of the object. If a string is given, use the string as the key, otherwise use an underscored version of the model’s name. |
# File lib/sequel/plugins/json_serializer.rb 316 def to_json(*a) 317 opts = model.json_serializer_opts 318 opts = opts.merge(@json_serializer_opts) if @json_serializer_opts 319 if (arg_opts = a.first).is_a?(Hash) 320 opts = opts.merge(arg_opts) 321 a = [] 322 end 323 324 vals = values 325 cols = if only = opts[:only] 326 Array(only) 327 else 328 vals.keys - Array(opts[:except]) 329 end 330 331 h = {} 332 333 cols.each{|c| h[c.to_s] = get_column_value(c)} 334 if inc = opts[:include] 335 if inc.is_a?(Hash) 336 inc.each do |k, v| 337 if k.is_a?(Sequel::SQL::AliasedExpression) 338 key_name = k.alias.to_s 339 k = k.expression 340 else 341 key_name = k.to_s 342 end 343 344 v = v.empty? ? [] : [v] 345 h[key_name] = JsonSerializer.object_to_json_data(public_send(k), *v) 346 end 347 else 348 Array(inc).each do |c| 349 if c.is_a?(Sequel::SQL::AliasedExpression) 350 key_name = c.alias.to_s 351 c = c.expression 352 else 353 key_name = c.to_s 354 end 355 356 h[key_name] = JsonSerializer.object_to_json_data(public_send(c)) 357 end 358 end 359 end 360 361 if root = opts[:root] 362 unless root.is_a?(String) 363 root = model.send(:underscore, model.send(:demodulize, model.to_s)) 364 end 365 h = {root => h} 366 end 367 368 h = yield h if defined?(yield) 369 Sequel.object_to_json(h, *a) 370 end
Convert the receiver to a JSON data structure using the given arguments.
# File lib/sequel/plugins/json_serializer.rb 373 def to_json_data(*args, &block) 374 if block 375 to_json(*args){|x| return block.call(x)} 376 else 377 to_json(*args){|x| return x} 378 end 379 end