# XComResponseString

XCom response serializer with string return type.

## Properties

Name | Type | Description | Notes
------------ | ------------- | ------------- | -------------
**dag_display_name** | **str** |  | 
**dag_id** | **str** |  | 
**key** | **str** |  | 
**logical_date** | **datetime** |  | [optional] 
**map_index** | **int** |  | 
**run_after** | **datetime** |  | 
**run_id** | **str** |  | 
**task_display_name** | **str** |  | 
**task_id** | **str** |  | 
**timestamp** | **datetime** |  | 
**value** | **str** |  | [optional] 

## Example

```python
from airflow_client.client.models.x_com_response_string import XComResponseString

# TODO update the JSON string below
json = "{}"
# create an instance of XComResponseString from a JSON string
x_com_response_string_instance = XComResponseString.from_json(json)
# print the JSON string representation of the object
print(XComResponseString.to_json())

# convert the object into a dict
x_com_response_string_dict = x_com_response_string_instance.to_dict()
# create an instance of XComResponseString from a dict
x_com_response_string_from_dict = XComResponseString.from_dict(x_com_response_string_dict)
```
[[Back to Model list]](../README.md#documentation-for-models) [[Back to API list]](../README.md#documentation-for-api-endpoints) [[Back to README]](../README.md)


