module Sequel::Plugins::JsonSerializer::InstanceMethods
Public Instance Methods
Source
# 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
Parse the provided JSON, which should return a hash, and process the hash with from_json_node.
Source
# 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
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
Symbol
for a single association, an array of symbols for multiple associations, or a hash with symbol keys and dependent association option hash values. - :fields
-
Changes the behavior to call set_fields using the provided fields, instead of calling set.
Source
# 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
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":"..."}]'
Source
# 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
Return a string in JSON format. Accepts the following options:
- :except
-
Symbol
orArray
of Symbols of columns not to include in the JSON output. - :include
-
Symbol
,Array
of Symbols, or aHash
withSymbol
keys andHash
values specifying associations or other non-column attributes to include in the JSON output. Using a nested hash, you can pass options to associations to affect the JSON used for associated objects. - :only
-
Symbol
orArray
of Symbols of columns to only include in the JSON output, ignoring all other columns. - :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.
Source
# 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
Convert the receiver to a JSON data structure using the given arguments.