Skip to content

Commit

Permalink
Added json.md - Serialization part (#1083) (#1084)
Browse files Browse the repository at this point in the history
(cherry picked from commit c40e486)

Signed-off-by: Jai2305 <[email protected]>
Signed-off-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
  • Loading branch information
1 parent 0242507 commit 67b8c1a
Show file tree
Hide file tree
Showing 4 changed files with 110 additions and 1 deletion.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ Inspired from [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
## [Unreleased 2.x]
### Added
- Add support for phase_took & search_pipeline request params ([#1036](https://github.com/opensearch-project/opensearch-java/pull/1036))
- Add an interface PlainJsonSerializable inherit from JsonpSerializable with a default method streamlining serialization ([#1064](https://github.com/opensearch-project/opensearch-java/pull/1064))
- Add an interface PlainJsonSerializable with a default method for serialization to Json ([#1064](https://github.com/opensearch-project/opensearch-java/pull/1064))

### Dependencies
- Bumps `io.github.classgraph:classgraph` from 4.8.173 to 4.8.174
Expand Down
1 change: 1 addition & 0 deletions USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ You can find a working sample of the above code in [IndexingBasics.java](./sampl
- [Point-in-Time APIs](./guides/point_in_time.md)
- [Search](./guides/search.md)
- [Generic Client](./guides/generic.md)
- [Json](./guides/json.md)

## Plugins

Expand Down
53 changes: 53 additions & 0 deletions guides/json.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
- [Working With JSON](#working-with-json)
- [Serialization](#serialization)
- [Using toJsonString](#using-tojsonstring)
- [Manual Serialization](#manual-serialization)


# Working With JSON

OpenSearch Java client seamlessly integrates with JSON, providing serialization and deserialization capability.

## Serialization

For demonstration let's consider an instance of `SearchRequest`.

```java

SearchRequest searchRequest = SearchRequest.of(
request -> request.index("index1", "index2")
.aggregations(Collections.emptyMap())
.terminateAfter(5L)
.query(q -> q.match(t -> t.field("name").query(FieldValue.of("OpenSearch"))))
);
```
### Using toJsonString
For classes implementing `PlainJsonSerializable`, which extends `JsonpSerializable`, a default `toJsonString` method is provided.
This implementation uses `jakarta.json.spi.JsonProvider` SPI to discover the available JSON provider instance
from the classpath and to create a new mapper. The `JsonpUtils` utility class streamlines this serialization process.
The following code example demonstrates how to use the `toJsonString` method to serialize objects:

```java
String requestString = searchRequest.toJsonString();
```


### Manual Serialization
For classes implementing the `JsonpSerializable` interface, a serialize method is provided, which takes a mapper and a generator
as arguments and returns the JSON string representation of the instance.

The following sample code demonstrates how to serialize an instance of a Java class:

```java
private String toJson(JsonpSerializable object) {
try (StringWriter writer = new StringWriter()) {
JsonbJsonpMapper mapper = new JsonbJsonpMapper();
try (JsonGenerator generator = mapper.jsonProvider().createGenerator(writer)) {
serialize(generator, mapper);
}
return writer.toString();
} catch (IOException ex) {
throw new UncheckedIOException(ex);
}
}
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* SPDX-License-Identifier: Apache-2.0
*
* The OpenSearch Contributors require contributions made to
* this file be licensed under the Apache-2.0 license or a
* compatible open source license.
*/

package org.opensearch.client.samples.json;

import java.util.List;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.opensearch.client.opensearch.OpenSearchClient;
import org.opensearch.client.opensearch.indices.PutIndexTemplateRequest;
import org.opensearch.client.opensearch.indices.PutIndexTemplateResponse;
import org.opensearch.client.samples.SampleClient;
import org.opensearch.client.samples.Search;

public class SerializationBasics {

private static final Logger LOGGER = LogManager.getLogger(Search.class);

private static OpenSearchClient client;

public static void main(String[] args) {
try {
client = SampleClient.create();

var version = client.info().version();
LOGGER.info("Server: {}@{}.", version.distribution(), version.number());

final var indexTemplateName = "my-index";
final var indexSettingsComponentTemplate = "index-settings";
final var indexMappingsComponentTemplate = "index-mappings";

// Create Index Template Request for index 'my-index'.
PutIndexTemplateRequest putIndexTemplateRequest = PutIndexTemplateRequest.of(
it -> it.name(indexTemplateName)
.indexPatterns("my-index-*")
.composedOf(List.of(indexSettingsComponentTemplate, indexMappingsComponentTemplate))
);

LOGGER.info("Creating index template {}.", indexTemplateName);

// Use toJsonString method to log Request and Response string.
LOGGER.debug("Index Template Request: {}.", putIndexTemplateRequest.toJsonString());
PutIndexTemplateResponse response = client.indices().putIndexTemplate(putIndexTemplateRequest);
LOGGER.info("Index Template Response: {}.", response.toJsonString());

} catch (Exception e) {
LOGGER.error("Exception occurred.", e);
}
}
}

0 comments on commit 67b8c1a

Please sign in to comment.