fields property

Map<String, String> get fields

Returns all top-level string values, even if the JSON is incomplete.

Implementation

Map<String, String> get fields {
  final s = _buffer.toString();
  final result = <String, String>{};
  var inStr = false;
  var esc = false;
  var key = '';
  var value = '';
  var readingKey = false;
  var readingValue = false;
  var keyDone = false;
  var valueStarted = false;

  for (var i = 0; i < s.length; i++) {
    final c = s[i];
    if (esc) {
      esc = false;
      if (readingKey) key += c;
      if (readingValue) value += c;
      continue;
    }
    if (inStr) {
      if (c == r'\') {
        esc = true;
        continue;
      }
      if (c == '"') {
        inStr = false;
        if (readingKey) {
          readingKey = false;
          keyDone = true;
        } else if (readingValue) {
          readingValue = false;
          valueStarted = true;
          result[key] = value;
        }
        continue;
      }
      if (readingKey) key += c;
      if (readingValue) value += c;
      continue;
    }
    // Not in string
    if (c == '"') {
      inStr = true;
      if (!keyDone && !readingValue) {
        readingKey = true;
        key = '';
      } else if (keyDone && !readingValue && !valueStarted) {
        readingValue = true;
        value = '';
      }
      continue;
    }
    if (c == ':') {
      continue;
    }
    if (c == ',') {
      if (!inStr) {
        key = '';
        value = '';
        keyDone = false;
        readingValue = false;
        valueStarted = false;
      }
      continue;
    }
    // Skip digits and other chars
  }
  return result;
}