 	
 	public let json: [String : Any]
 	
+	/// Field-level metadata
+	// TODO: "fields" could be missing in JSON, so this property should be optional
+	// and will be modified accordingly in the next major release.
+	// Updated in v.3.4.1: if "fields" is missing, return empty dictionary.
 	public var fields: [String: FieldDescription] {
-		let jsons = json["fields"] as! [[String: Any]]
+		guard let jsons = json["fields"] as? [[String: Any]] else {
+			return [:]
+		}
 		let fields = jsons.asDictionary {
 			(json) -> [String: FieldDescription] in
 			let field = FieldDescription(json: json)

	/// The first 3 characters of this object's record IDs
	// TODO: "keyPrefix" could be null, so this property should be optional
	// and will be modified accordingly in the next major release.
	// Updated in v. 3.4.1: if keyPrefix is null, return empty string.
	public var keyPrefix: String {
		guard let keyPrefix = json["keyPrefix"] as? String else {
			return ""
		}
		return keyPrefix
	}
	
	public var label: String {

	public let maximum: Int
	public let remaining: Int
	
	public init(name: String, json: [String: Any]) throws {
		guard let remaining = json["Remaining"] as? Int, let maximum = json["Max"] as? Int else {
			throw SalesforceError.jsonDeserializationFailure(elementName: name, json: json)
		}
		self.name = name
