38 lines
1.1 KiB
Python
38 lines
1.1 KiB
Python
from .base import Column
|
|
from .stringcolumn import String
|
|
from ..reader import read_binary_uint8, read_binary_str
|
|
from ..util.compat import json
|
|
from ..writer import write_binary_uint8
|
|
|
|
|
|
class JsonColumn(Column):
|
|
py_types = (dict, )
|
|
|
|
# No NULL value actually
|
|
null_value = {}
|
|
|
|
def __init__(self, column_by_spec_getter, **kwargs):
|
|
self.column_by_spec_getter = column_by_spec_getter
|
|
self.string_column = String(**kwargs)
|
|
super(JsonColumn, self).__init__(**kwargs)
|
|
|
|
def write_state_prefix(self, buf):
|
|
# Read in binary format.
|
|
# Write in text format.
|
|
write_binary_uint8(1, buf)
|
|
|
|
def read_items(self, n_items, buf):
|
|
read_binary_uint8(buf)
|
|
spec = read_binary_str(buf)
|
|
col = self.column_by_spec_getter(spec)
|
|
col.read_state_prefix(buf)
|
|
return col.read_data(n_items, buf)
|
|
|
|
def write_items(self, items, buf):
|
|
items = [x if isinstance(x, str) else json.dumps(x) for x in items]
|
|
self.string_column.write_items(items, buf)
|
|
|
|
|
|
def create_json_column(spec, column_by_spec_getter, column_options):
|
|
return JsonColumn(column_by_spec_getter, **column_options)
|