code: def _value_to_json(cls, value):
      cls_type = _get_class_type(cls)
      assert _is_optional(cls) or value is not None
      if value is None:
          return value
      # optional with more than 2 classes is treated as Union
      elif _is_optional(cls) and len(cls.__args__) == 2:
          sub_cls = (
              cls.__args__[0]
              if type(None) != cls.__args__[0]
              else cls.__args__[1]
          )
          return _value_to_json(sub_cls, value)
      elif cls_type == Union or getattr(cls, "__EXPANSIBLE__", False):
          real_cls = type(value)
          if hasattr(real_cls, "_fields"):
              value = config_to_json(real_cls, value)
          return {_canonical_typename(real_cls): value}
      elif cls_type == Any:
          return value
      # nested config
      elif hasattr(cls, "_fields"):
          return config_to_json(cls, value)
      elif issubclass(cls_type, Enum):
          return value.value
      elif issubclass(cls_type, List):
          sub_cls = cls.__args__[0]
          return [_value_to_json(sub_cls, v) for v in value]
      elif issubclass(cls_type, Tuple):
          return tuple(
              _value_to_json(c, v)
              for c, v in zip(_extend_tuple_type(cls, value), value)
          )
      elif issubclass(cls_type, Dict):
          sub_cls = cls.__args__[1]
          return {
              key: _value_to_json(sub_cls, v)
              for key, v in value.items()
          }
      return value
  
imports: from enum import Enum
  from typing import Any, Dict, List, Tuple, Type, Union
  from pytext.common.utils import eprint
  from .component import Registry
  from .config_adapter import upgrade_to_latest
  from .pytext_config import PyTextConfig
label_desc: Use image node_id 14 for calling a global function with example usage: _value_to_json(cls, value) and returns: value, value, _value_to_json, dict, value, config_to_json, value, unknown, tuple, unknown