 
   var jsonDescription: JSON { get {
     return JSON.jDictionary([
-      "event_name" : JSON.jString(self.eventName.rawValue),
-      "event_type" : JSON.jString(self.eventType.rawValue),
-      "target" : self.targetSubject.jsonDescription,
-      "subject" : self.subject.jsonDescription,
-      "timestamp" : JSON.jNumber(NSNumber(value: round(self.timestamp.timeIntervalSince1970) as Double)),
+      JSONKeys.EventName.rawValue : JSON.jString(self.eventName.rawValue),
+      JSONKeys.EventType.rawValue : JSON.jString(self.eventType.rawValue),
+      JSONKeys.Target.rawValue : self.targetSubject.jsonDescription,
+      JSONKeys.Subject.rawValue : self.subject.jsonDescription,
+      JSONKeys.Timestamp.rawValue : JSON.jNumber(NSNumber(value: round(self.timestamp.timeIntervalSince1970) as Double)),
     ])
   }}
 


  var jsonDescription: JSON { get {
    return JSON.jDictionary([
      "event_name" : JSON.jString(self.eventName.rawValue),
      "event_type" : JSON.jString(self.eventType.rawValue),
      "subject" : self.subject.jsonDescription,
      "timestamp" : JSON.jNumber(NSNumber(value: round(Date().timeIntervalSince1970) as Double)),
    ])
  }}



import Foundation

public enum JSONKeys : String {
  case EventName = "event_name"
  case EventType = "event_type"
  case Level = "level"
  case Subject = "subject"
  case Target = "target"
  case Timestamp = "timestamp"
}

public protocol EventReporterSubject : CustomStringConvertible {
  var jsonDescription: JSON { get }
  var subSubjects: [EventReporterSubject] { get }
