Skip to content

Commit

Permalink
Added json.md - Serialization part (opensearch-project#1083)
Browse files Browse the repository at this point in the history
Signed-off-by: Jai2305 <[email protected]>
  • Loading branch information
Jai2305 authored Jul 16, 2024
1 parent d9b5f4f commit c40e486
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 @@ -15,7 +15,7 @@ This section is for maintaining a changelog for all breaking changes for the cli
### Added
- Document HTTP/2 support ([#330](https://github.com/opensearch-project/opensearch-java/pull/330))
- 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

Expand Down
1 change: 1 addition & 0 deletions USER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -199,6 +199,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 c40e486

Please sign in to comment.