Thing.fromJson constructor

Thing.fromJson(
  1. Map<String, dynamic> map
)

Creates a Thing from a decoded json entry.

Could throw InvalidJsonSchemaException or a specific JsonMissingKeyException and if something went wrong during the parsing to the directory objects.

Implementation

factory Thing.fromJson(Map<String, dynamic> map) {
  try {
    final String tId = map.containsKey(DittoKeys.thingId)
        ? map[DittoKeys.thingId] as String
        : throw JsonMissingKeyException(DittoKeys.thingId, map.toString());
    final Thing internalThing = Thing(tId);
    if (map.containsKey(DittoKeys.attributes)) {
      final Map<String, dynamic> attributesMap =
          map[DittoKeys.attributes] as Map<String, dynamic>;
      internalThing.name = attributesMap[DirectoryKeys.name] as String?;
      try {
        internalThing.thingType =
            attributesMap.containsKey(DirectoryKeys.thingType)
                ? _createThingType(
                    attributesMap[DirectoryKeys.thingType] as String)
                : null;
      } on FallThroughError {
        throw InvalidJsonSchemaException(
            'unknown thing type', map.toString());
      } on TypeError {
        throw InvalidJsonSchemaException(
            'thing type is no string', map.toString());
      }
      internalThing
        ..dataModel = attributesMap[DirectoryKeys.dataModel] as String?
        ..publicKey = attributesMap[DirectoryKeys.publicKey] as String?
        ..allEndpoints = attributesMap.containsKey(DirectoryKeys.allEndpoints)
            ? _createEndpointList(
                attributesMap[DirectoryKeys.allEndpoints] as List<dynamic>)
            : null
        ..defaultEndpoint = attributesMap
                .containsKey(DirectoryKeys.defaultEndpoint)
            ? Endpoint(attributesMap[DirectoryKeys.defaultEndpoint] as String)
            : null
        ..defaultHMI = attributesMap[DirectoryKeys.defaultHMI] as String?
        ..location = attributesMap.containsKey(DirectoryKeys.location)
            ? Location.fromJson(
                attributesMap[DirectoryKeys.location] as Map<String, dynamic>)
            : null
        ..ownedBy = attributesMap[DirectoryKeys.ownedBy] as String?
        ..administratedBy =
            attributesMap[DirectoryKeys.administratedBy] as String?
        ..usedBy = attributesMap[DirectoryKeys.usedBy] as String?
        ..represents = attributesMap[DirectoryKeys.represents] as String?
        ..thingStructure = attributesMap
                .containsKey(DirectoryKeys.thingStructure)
            ? DirObject.fromJson(attributesMap[DirectoryKeys.thingStructure]
                as Map<String, dynamic>)
            : null;
    }
    return internalThing;
  } on TypeError catch (e) {
    throw InvalidJsonSchemaException(e.stackTrace.toString(), map.toString());
  }
}