docs: def unpack(self, gpsd_socket_response):
          """Sets new socket data as DataStream attributes in those initialised dictionaries
          Arguments:
              gpsd_socket_response (json object):
          Provides:
          self attribute dictionaries, e.g., self.TPV['lat'], self.SKY['gdop']
          Raises:
          AttributeError: 'str' object has no attribute 'keys' when the device falls out of the system
          ValueError, KeyError: most likely extra, or mangled JSON data, should not happen, but that
          applies to a lot of things.
          """
          try:
              fresh_data = json.loads(gpsd_socket_response)  # The reserved word 'class' is popped from JSON object class
              package_name = fresh_data.pop('class', 'ERROR')  # gpsd data package errors are also 'ERROR'.
              package = getattr(self, package_name, package_name)  # packages are named for JSON object class
              for key in package.keys():
                  package[key] = fresh_data.get(key, 'n/a')  # Restores 'n/a' if key is absent in the socket response
  
          except AttributeError:  # 'str' object has no attribute 'keys'
              sys.stderr.write('There is an unexpected exception in DataStream.unpack')
              return
  
          except (ValueError, KeyError) as error:
              sys.stderr.write(str(error))  # Extra data or aberrant data in stream.
              return