@Test void skipsIncompleteEndpoint() {
    assertThat(SpanBytesDecoder.JSON_V2.decodeOne(("""
      {
        "traceId": "6b221d5bc9e6496c",
        "id": "6b221d5bc9e6496c",
        "localEndpoint": {
          "serviceName": null,
          "ipv4": null,
          "ipv6": null,
          "port": null
        }
      }
      """)
      .getBytes(UTF_8)).localEndpoint()).isNull();
    assertThat(SpanBytesDecoder.JSON_V2.decodeOne(("""
      {
        "traceId": "6b221d5bc9e6496c",
        "id": "6b221d5bc9e6496c",
        "localEndpoint": {
        }
      }
      """)
      .getBytes(UTF_8)).localEndpoint()).isNull();
    assertThat(SpanBytesDecoder.JSON_V2.decodeOne(("""
      {
        "traceId": "6b221d5bc9e6496c",
        "id": "6b221d5bc9e6496c",
        "remoteEndpoint": {
          "serviceName": null,
          "ipv4": null,
          "ipv6": null,
          "port": null
        }
      }
      """)
      .getBytes(UTF_8)).remoteEndpoint()).isNull();
    assertThat(SpanBytesDecoder.JSON_V2.decodeOne(("""
      {
        "traceId": "6b221d5bc9e6496c",
        "id": "6b221d5bc9e6496c",
        "remoteEndpoint": {
        }
      }
      """)
      .getBytes(UTF_8)).remoteEndpoint()).isNull();
  }
Particular, thrift can mistake malformed content as a huge list. Let's not blow up.
zipkin/src/test/java/zipkin2/codec/SpanBytesDecoderTest.java