code: def testJsonRoundTrip(self):
      proto_property = metadata_store_pb2.Value()
      proto_property.proto_value.Pack(
          struct_pb2.Value(string_value="proto-string-val")
      )
      chnl = channel.Channel(
          type=_MyType,
          additional_properties={
              "string_value": metadata_store_pb2.Value(
                  string_value="forty-two"
              ),
              "proto_value": proto_property,
          },
          additional_custom_properties={
              "int_value": metadata_store_pb2.Value(int_value=42)
          },
      )
      serialized = chnl.to_json_dict()
      rehydrated = channel.Channel.from_json_dict(serialized)
      self.assertIs(chnl.type, rehydrated.type)
      self.assertEqual(chnl.type_name, rehydrated.type_name)
      self.assertEqual(
          chnl.additional_properties, rehydrated.additional_properties
      )
      self.assertEqual(
          chnl.additional_custom_properties,
          rehydrated.additional_custom_properties,
      )
  
imports: from unittest import mock
  import tensorflow
  from tfx.dsl.input_resolution import resolver_op
  from tfx.dsl.placeholder import placeholder
  from tfx.types import artifact
  from tfx.types import channel
  from tfx.types import resolved_channel
  from google.protobuf import struct_pb2
  from ml_metadata.proto import metadata_store_pb2
label_desc: Use image node_id 4 for calling the ChannelTest obj's underlying member method code with example usage: obj.testJsonRoundTrip() without return types