operator [] method

JSON operator [](
  1. dynamic key
)

if key is String & type is map return json whose object is map[k] , otherwise return json.nil with error. if key is int & type is list return json whose object is list[k], otherwise return json.nil with error. if key is List<String/int> recursive aboves.

Implementation

JSON operator [](dynamic key) {
  var r = JSON.nil;
  if (key is String) {
    if (_type == Type.map) {
      final o = _rawMap[key];
      if (o == null) {
        r.error = _JSONNilReason.notExist(key);
      } else {
        return JSON(o);
      }
    } else {
      r.error = _JSONNilReason.wrongType(key, true);
    }
    return r;
  } else if (key is List) {
    return key.fold(this, (j, sk) => j[sk]);
  } else if (key is int) {
    if (_type == Type.list) {
      if (key < _rawList.length) {
        return JSON(_rawList[key]);
      } else {
        r.error = _JSONNilReason.outOfBounds(key);
      }
    }
    r.error = _JSONNilReason.wrongType(key, false);
    return r;
  }
  return r;
}