fromJsonObject method

Value fromJsonObject(
  1. dynamic json
)

Implementation

Value fromJsonObject(dynamic json) {
  if (json is double) {
    return Value(doubleValue: json);
  }

  if (json is int) {
    return Value(integerValue: json.toString());
  }

  if (json is bool) {
    return Value(booleanValue: json);
  }

  if (json is Map<String, dynamic>) {
    final map = <String, Value>{};
    for (final entry in json.entries) {
      map[entry.key] = fromJsonObject(entry.value);
    }
    return Value(mapValue: MapValue(fields: map));
  }

  if (json is List<dynamic>) {
    final list = <Value>[];
    for (final entry in json) {
      list.add(fromJsonObject(entry));
    }
    return Value(arrayValue: ArrayValue(values: list));
  }

  if (json is String) {
    if (json.startsWith(_locationPrefix)) {
      final strings = json.substring(_locationPrefix.length).split('/');
      final lat = double.parse(strings[0]);
      final lon = double.parse(strings[1]);
      return Value(geoPointValue: LatLng(latitude: lat, longitude: lon));
    }

    if (json.startsWith(_referencePrefix)) {
      final ref = json.substring(_referencePrefix.length);
      return Value(referenceValue: ref);
    }

    if (json.startsWith(_bytesPrefix)) {
      final bytes = json.substring(_bytesPrefix.length);
      return Value(bytesValue: bytes);
    }

    if (json.startsWith(_datetimePrefix)) {
      final datetimeRaw = json.substring(_datetimePrefix.length);
      final datetimeFormatted = DateTime.parse(datetimeRaw).toIso8601String();
      return Value(timestampValue: datetimeFormatted);
    }

    return Value(stringValue: json);
  }

  if (json == null) {
    return Value(nullValue: 'NULL_VALUE');
  }

  throw FormatException('Unknown data type: json=$json');
}