def _iterencode_dict()

in ambari-common/src/main/python/ambari_simplejson/encoder.py [0:0]


  def _iterencode_dict(dct, _current_indent_level):
    if not dct:
      yield "{}"
      return
    if markers is not None:
      markerid = id(dct)
      if markerid in markers:
        raise ValueError("Circular reference detected")
      markers[markerid] = dct
    yield "{"
    if _indent is not None:
      _current_indent_level += 1
      newline_indent = "\n" + (_indent * _current_indent_level)
      item_separator = _item_separator + newline_indent
      yield newline_indent
    else:
      newline_indent = None
      item_separator = _item_separator
    first = True
    if _PY3:
      iteritems = dct.items()
    else:
      iteritems = dct.iteritems()
    if _item_sort_key:
      items = []
      for k, v in dct.items():
        if not isinstance(k, string_types):
          k = _stringify_key(k)
          if k is None:
            continue
        items.append((k, v))
      items.sort(key=_item_sort_key)
    else:
      items = iteritems
    for key, value in items:
      if not (_item_sort_key or isinstance(key, string_types)):
        key = _stringify_key(key)
        if key is None:
          # _skipkeys must be True
          continue
      if first:
        first = False
      else:
        yield item_separator
      yield _encoder(key)
      yield _key_separator
      if isinstance(value, string_types):
        yield _encoder(value)
      elif _PY3 and isinstance(value, bytes) and _encoding is not None:
        yield _encoder(value)
      elif isinstance(value, RawJSON):
        yield value.encoded_json
      elif value is None:
        yield "null"
      elif value is True:
        yield "true"
      elif value is False:
        yield "false"
      elif isinstance(value, integer_types):
        yield _encode_int(value)
      elif isinstance(value, float):
        yield _floatstr(value)
      elif _use_decimal and isinstance(value, Decimal):
        yield str(value)
      else:
        for_json = _for_json and getattr(value, "for_json", None)
        if for_json and callable(for_json):
          chunks = _iterencode(for_json(), _current_indent_level)
        elif isinstance(value, list):
          chunks = _iterencode_list(value, _current_indent_level)
        else:
          _asdict = _namedtuple_as_object and getattr(value, "_asdict", None)
          if _asdict and callable(_asdict):
            chunks = _iterencode_dict(_asdict(), _current_indent_level)
          elif _tuple_as_array and isinstance(value, tuple):
            chunks = _iterencode_list(value, _current_indent_level)
          elif isinstance(value, dict):
            chunks = _iterencode_dict(value, _current_indent_level)
          else:
            chunks = _iterencode(value, _current_indent_level)
        for chunk in chunks:
          yield chunk
    if newline_indent is not None:
      _current_indent_level -= 1
      yield "\n" + (_indent * _current_indent_level)
    yield "}"
    if markers is not None:
      del markers[markerid]