{"record":{"id":"6c8dbd89e5dd9580","repo":"openzipkin/zipkin","slug":"not-a-valid-json-object-start-token","errorCode":null,"errorMessage":"Not a valid JSON object, start token: {}","messagePattern":"Not a valid JSON object, start token: (.+?)","errorType":"exception","errorClass":"IllegalArgumentException","httpStatus":null,"severity":"error","filePath":"zipkin-storage/elasticsearch/src/main/java/zipkin2/elasticsearch/internal/JsonSerializers.java","lineNumber":120,"sourceCode":"          }\n          break;\n        case \"debug\":\n          result.debug(parser.getBooleanValue());\n          break;\n        case \"shared\":\n          result.shared(parser.getBooleanValue());\n          break;\n        default:\n          // Skip\n      }\n    }\n\n    return result.build();\n  }\n\n  static Endpoint parseEndpoint(JsonParser parser) throws IOException {\n    if (!parser.isExpectedStartObjectToken()) {\n      throw new IllegalArgumentException(\"Not a valid JSON object, start token: \" +\n        parser.currentToken());\n    }\n\n    String serviceName = null, ipv4 = null, ipv6 = null;\n    int port = 0;\n\n    while (parser.nextToken() != JsonToken.END_OBJECT) {\n      JsonToken value = parser.nextValue();\n      if (value == JsonToken.VALUE_NULL) {\n        continue;\n      }\n\n      switch (parser.currentName()) {\n        case \"serviceName\":\n          serviceName = parser.getText();\n          break;\n        case \"ipv4\":\n          ipv4 = parser.getText();","sourceCodeStart":102,"sourceCodeEnd":138,"githubUrl":"https://github.com/openzipkin/zipkin/blob/878ce2a1fad54ca941d17fdcf2e1d924b148eb1f/zipkin-storage/elasticsearch/src/main/java/zipkin2/elasticsearch/internal/JsonSerializers.java#L102-L138","documentation":"parseEndpoint decodes the localEndpoint/remoteEndpoint field of a span and requires it to be a JSON object; a non-object start token throws IllegalArgumentException naming the token. Fields inside (serviceName, ipv4, ipv6, port) are then read; an object with all-null/zero values returns null.","triggerScenarios":"A span document where \"localEndpoint\" or \"remoteEndpoint\" is a string, array, or number — e.g. \"localEndpoint\":\"frontend\" — parsed by SPAN_PARSER.","commonSituations":"Simplified hand-written fixtures that inline the service name; converters from other formats (OpenTelemetry, Jaeger) emitting endpoint as a scalar; custom writers inserting documents into Zipkin indices.","solutions":["Fix the document: endpoint must be an object like \"localEndpoint\":{\"serviceName\":\"frontend\",\"ipv4\":\"10.0.0.1\",\"port\":8080}.","Fix the converting pipeline to build the object shape.","Remove/reindex malformed documents.","In Java, set endpoints via Span.Builder.localEndpoint(Endpoint...) so encoding is handled."],"exampleFix":"// before\n{\"traceId\":\"abc\",\"id\":\"def\",\"localEndpoint\":\"frontend\"}\n// -> IllegalArgumentException: Not a valid JSON object, start token: VALUE_STRING\n\n// after\n{\"traceId\":\"abc\",\"id\":\"def\",\"localEndpoint\":{\"serviceName\":\"frontend\"}}","handlingStrategy":"type-guard","validationCode":"var span = objectMapper.readTree(spanJson);\nfor (String f : new String[]{\"localEndpoint\", \"remoteEndpoint\"}) {\n  JsonNode e = span.get(f);\n  if (e != null && !e.isObject()) throw new IOException(f + \" must be an object\");\n}","typeGuard":"boolean endpointWellFormed(JsonNode span, String field) {\n  JsonNode e = span.get(field);\n  return e == null || e.isObject();\n}","tryCatchPattern":"try { Span s = SPAN_PARSER.parse(p); }\ncatch (IllegalArgumentException e) {\n  if (e.getMessage().startsWith(\"Not a valid JSON object\") && rawJson.contains(\"Endpoint\")) {\n    // endpoint field is not an object; fix producer to emit {serviceName,...}\n  }\n}","preventionTips":["Encode endpoints as objects with serviceName/ipv4/ipv6/port keys.","Set endpoints via Span.Builder.localEndpoint(Endpoint.newBuilder()...) in code.","When converting from OTel/Jaeger, map resource attributes into an endpoint object."],"tags":["elasticsearch","json-parsing","endpoint","span","schema"],"backgroundTag":null,"analyzedSha":"878ce2a1fad54ca941d17fdcf2e1d924b148eb1f","analyzedAt":"2026-08-14T15:17:09.895Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}