     public func encode(to encoder: Encoder) throws {
         var container = encoder.container(keyedBy: CodingKeys.self)
         try container.encode(dialogNodeID, forKey: .dialogNodeID)
-        try container.encode(description, forKey: .description)
-        try container.encode(conditions, forKey: .conditions)
-        try container.encode(parent, forKey: .parent)
-        try container.encode(previousSibling, forKey: .previousSibling)
-        try container.encode(output, forKey: .output)
-        try container.encode(context, forKey: .context)
-        try container.encode(metadata, forKey: .metadata)
-        try container.encode(nextStep, forKey: .nextStep)
-        try container.encode(created, forKey: .created)
+        try container.encodeIfPresent(description, forKey: .description)
+        try container.encodeIfPresent(conditions, forKey: .conditions)
+        try container.encodeIfPresent(parent, forKey: .parent)
+        try container.encodeIfPresent(previousSibling, forKey: .previousSibling)
+        try container.encodeIfPresent(output, forKey: .output)
+        try container.encodeIfPresent(context, forKey: .context)
+        try container.encodeIfPresent(metadata, forKey: .metadata)
+        try container.encodeIfPresent(nextStep, forKey: .nextStep)
+        try container.encodeIfPresent(created, forKey: .created)
         try container.encodeIfPresent(updated, forKey: .updated)
         try container.encodeIfPresent(actions, forKey: .actions)
-        try container.encode(title, forKey: .title)
+        try container.encodeIfPresent(title, forKey: .title)
         try container.encodeIfPresent(nodeType, forKey: .nodeType)
         try container.encodeIfPresent(eventName, forKey: .eventName)
         try container.encodeIfPresent(variable, forKey: .variable)

    public var dialogNodeID: String

    /// The description of the dialog node.
    public var description: String

    /// The condition that triggers the dialog node.
    public var conditions: String

    /// The ID of the parent dialog node.
    public var parent: String

    /// The ID of the previous sibling dialog node.
    public var previousSibling: String

    /// The output of the dialog node.
    public var output: [String: JSON]

    /// The context (if defined) for the dialog node.
    public var context: [String: JSON]

    /// The metadata (if any) for the dialog node.
    public var metadata: [String: JSON]

    /// The next step to execute following this dialog node.
    public var nextStep: DialogNodeNextStep

    /// The timestamp for creation of the dialog node.
    public var created: String

    /// The timestamp for the most recent update to the dialog node.
    public var updated: String?

    public init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        dialogNodeID = try container.decode(String.self, forKey: .dialogNodeID)
        description = try container.decodeIfPresent(String.self, forKey: .description)
        conditions = try container.decodeIfPresent(String.self, forKey: .conditions)
        parent = try container.decodeIfPresent(String.self, forKey: .parent)
        previousSibling = try container.decodeIfPresent(String.self, forKey: .previousSibling)
        output = try container.decodeIfPresent([String: JSON].self, forKey: .output)
        context = try container.decodeIfPresent([String: JSON].self, forKey: .context)
        metadata = try container.decodeIfPresent([String: JSON].self, forKey: .metadata)
        nextStep = try container.decodeIfPresent(DialogNodeNextStep.self, forKey: .nextStep)
        created = try container.decodeIfPresent(String.self, forKey: .created)
        updated = try container.decodeIfPresent(String.self, forKey: .updated)
        actions = try container.decodeIfPresent([DialogNodeAction].self, forKey: .actions)
        title = try container.decodeIfPresent(String.self, forKey: .title)
        nodeType = try container.decodeIfPresent(String.self, forKey: .nodeType)
        eventName = try container.decodeIfPresent(String.self, forKey: .eventName)
        variable = try container.decodeIfPresent(String.self, forKey: .variable)
