class Aws::Json::Parser

Public Class Methods

new(rules, query_compatible: false) click to toggle source

@param [Seahorse::Model::ShapeRef] rules

# File lib/aws-sdk-core/json/parser.rb, line 13
def initialize(rules, query_compatible: false)
  @rules = rules
  @query_compatible = query_compatible
end

Public Instance Methods

parse(json, target = nil) click to toggle source

@param [String<JSON>] json

# File lib/aws-sdk-core/json/parser.rb, line 19
def parse(json, target = nil)
  json = '{}' if json.empty?

  parse_ref(@rules, Json.load(json), target)
end

Private Instance Methods

flattened_list?(shape) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 104
def flattened_list?(shape)
  shape.is_a?(ListShape) && shape.flattened
end
flattened_map?(shape) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 108
def flattened_map?(shape)
  shape.is_a?(MapShape) && shape.flattened
end
list(ref, values, target = nil) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 63
def list(ref, values, target = nil)
  target = [] if target.nil?
  values.each do |value|
    target << parse_ref(ref.shape.member, value)
  end
  target
end
map(ref, values, target = nil) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 71
def map(ref, values, target = nil)
  target = {} if target.nil?
  values.each do |key, value|
    next if value.nil?

    target[key] = parse_ref(ref.shape.value, value)
  end
  target
end
parse_ref(ref, value, target = nil) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 81
def parse_ref(ref, value, target = nil)
  if value.nil?
    nil
  else
    case ref.shape
    when StructureShape then structure(ref, value, target)
    when ListShape then list(ref, value, target)
    when MapShape then map(ref, value, target)
    when TimestampShape then time(value)
    when BlobShape then Base64.decode64(value)
    when BooleanShape then value.to_s == 'true'
    when FloatShape then Util.deserialize_number(value)
    else value
    end
  end
end
structure(ref, values, target = nil) click to toggle source
# File lib/aws-sdk-core/json/parser.rb, line 27
def structure(ref, values, target = nil)
  shape = ref.shape
  target = ref.shape.struct_class.new if target.nil?
  values.each do |key, value|
    member_name, member_ref = shape.member_by_location_name(key)
    if member_ref
      target[member_name] = parse_ref(member_ref, value)
    elsif shape.union && key != '__type'
      target[:unknown] = { 'name' => key, 'value' => value }
    end
  end
  # In services that were previously Query/XML, members that were
  # "flattened" defaulted to empty lists. In JSON, these values are nil,
  # which is backwards incompatible. To preserve backwards compatibility,
  # we set a default value of [] for these members.
  if @query_compatible
    ref.shape.members.each do |member_name, member_target|
      next unless target[member_name].nil?

      if flattened_list?(member_target.shape)
        target[member_name] = []
      elsif flattened_map?(member_target.shape)
        target[member_name] = {}
      end
    end
  end

  if shape.union
    # convert to subclass
    member_subclass = shape.member_subclass(target.member).new
    member_subclass[target.member] = target.value
    target = member_subclass
  end
  target
end
time(value) click to toggle source

@param [String, Integer] value @return [Time]

# File lib/aws-sdk-core/json/parser.rb, line 100
def time(value)
  value.is_a?(Numeric) ? Time.at(value) : Aws::Util.deserialize_time(value)
end