Converting JsonData to Map in new ES Java Client

Sai_Satwik_Kuppili
Wed, 02 Jul 2025 21:11:25 +0000
Elasticsearch

Hello everyone,

I'm working with the new Elasticsearch Java Client and need to convert a Hit 's _source (provided as JsonData ) into a Map<String, Object> . The previous Rest High-Level Client offered SearchHit.getSourceAsMap() , but I require a reliable equivalent in the new client for dynamic field access without POJOs.

Here's the problem:

Using hit.source().to(Map.class) within a loop processing TopHitsAggregate results, like:

// ... inside a loop processing TopHitsAggregate results
List<Map<String, Object>> hits = new ArrayList<>();
for (Hit<JsonData> hit : topHitsResult.hits().hits()) {
    assert hit.source() != null;
    Map<String, Object> mappingJson = hit.source().to(Map.class); // This line
    hits.add(populateProtectionField(mappingJson)); // populateProtectionField is a custom method
}

This approach causes unexpected type issues or incorrect deserialization for nested fields in the _source document. While hit.source().toMap() correctly provides a Map<String, Object> with nested structures, my ultimate goal is to simplify certain fields.

Sample Response :

{
  "display_name": {
    "chars": "Default Layer3 Section",
    "string": "Default Layer3 Section",
    "valueType": "STRING"
  }
}

Desired Final Output (Transformed Map<String, Object> ):

{
  "display_name": "Default Layer3 Section"
}

Could you confirm hit.source().toMap() is the correct and robust approach for the initial deserialization, and then advise on best practices for subsequently transforming a nested Map<String, Object> (like the one for display_name ) into a flattened structure as shown in my desired output? Insights into why hit.source().to(Map.class) is problematic for complex JSON are also appreciated! Thank you.

2 posts - 2 participants