Module: Puppet::Util::Json

Defined in:
lib/puppet/util/json.rb

Defined Under Namespace

Classes: ParseError

Class Method Summary collapse

Class Method Details

.dump(object, options = {}) ⇒ Object


77
78
79
80
81
82
83
84
85
86
87
# File 'lib/puppet/util/json.rb', line 77

def self.dump(object, options = {})
  if defined? MultiJson
    MultiJson.dump(object, options)
  elsif options.is_a?(JSON::State)
    # we're being called recursively
    object.to_json(options)
  else
    options.merge!(::JSON::PRETTY_STATE_PROTOTYPE.to_h) if options.delete(:pretty)
    object.to_json(options)
  end
end

.load(string, options = {}) ⇒ Object

These methods do similar processing to the fallback implemented by MultiJson when using the built-in JSON backend, to ensure consistent behavior whether or not MultiJson can be loaded.


49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/puppet/util/json.rb', line 49

def self.load(string, options = {})
  if defined? MultiJson
    begin
      # This ensures that JrJackson will parse very large or very small
      # numbers as floats rather than BigDecimals, which are serialized as
      # strings by the built-in JSON gem and therefore can cause schema errors,
      # for example, when we are rendering reports to JSON using `to_pson` in
      # PuppetDB.
      if MultiJson.adapter.name == "MultiJson::Adapters::JrJackson"
        options[:use_bigdecimal] = false
      end

      MultiJson.load(string, options)
    rescue MultiJson::ParseError => e
      raise Puppet::Util::Json::ParseError.build(e, string)
    end
  else
    begin
      string = string.read if string.respond_to?(:read)

      options[:symbolize_names] = true if options.delete(:symbolize_keys)
      ::JSON.parse(string, options)
    rescue JSON::ParserError => e
      raise Puppet::Util::Json::ParseError.build(e, string)
    end
  end
end

.load_file(filename, options = {}) ⇒ Object

Load the content from a file as JSON.


41
42
43
44
# File 'lib/puppet/util/json.rb', line 41

def self.load_file(filename, options = {})
  json = Puppet::FileSystem.read(filename, :encoding => 'utf-8')
  load(json, options)
end

.load_file_if_valid(filename, options = {}) ⇒ Object

Load the content from a file as JSON if contents are in valid format. This method does not raise error but returns `nil` when invalid file is given.


33
34
35
36
37
38
# File 'lib/puppet/util/json.rb', line 33

def self.load_file_if_valid(filename, options = {})
  load_file(filename, options)
rescue Puppet::Util::Json::ParseError, ArgumentError, Errno::ENOENT => detail
  Puppet.debug("Could not retrieve JSON content from '#{filename}': #{detail.message}")
  nil
end