Skip to content

Commit d6a70d4

Browse files
committed
Add support for json-in-a-string serialization
1 parent 4bb678f commit d6a70d4

File tree

2 files changed

+33
-0
lines changed

2 files changed

+33
-0
lines changed

java-client/src/main/java/co/elastic/clients/json/JsonpDeserializer.java

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import jakarta.json.stream.JsonParser;
2525
import jakarta.json.stream.JsonParser.Event;
2626

27+
import java.io.StringReader;
2728
import java.util.EnumSet;
2829
import java.util.List;
2930
import java.util.Map;
@@ -216,4 +217,27 @@ static <K extends JsonEnum, V> JsonpDeserializer<Map<K, V>> enumMapDeserializer(
216217
) {
217218
return new JsonpDeserializerBase.EnumMapDeserializer<>(keyDeserializer, valueDeserializer);
218219
}
220+
221+
/**
222+
* Creates a deserializer that will accept a value both as regular JSON and as JSON-in-a-string.
223+
*/
224+
static <T> JsonpDeserializer<T> jsonString(JsonpDeserializer<T> valueDeserializer) {
225+
EnumSet<Event> acceptedEvents = EnumSet.copyOf(valueDeserializer.acceptedEvents());
226+
acceptedEvents.add(Event.VALUE_STRING);
227+
228+
EnumSet<Event> nativeEvents = EnumSet.copyOf(valueDeserializer.nativeEvents());
229+
nativeEvents.add(Event.VALUE_STRING);
230+
231+
return new JsonpDeserializerBase<T>(acceptedEvents, nativeEvents) {
232+
@Override
233+
public T deserialize(JsonParser parser, JsonpMapper mapper, Event event) {
234+
if (event == Event.VALUE_STRING) {
235+
JsonParser stringParser = mapper.jsonProvider().createParser(new StringReader(parser.getString()));
236+
return valueDeserializer.deserialize(stringParser, mapper);
237+
} else {
238+
return valueDeserializer.deserialize(parser, mapper, event);
239+
}
240+
}
241+
};
242+
}
219243
}

java-client/src/main/java/co/elastic/clients/json/JsonpUtils.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333

3434
import javax.annotation.Nullable;
3535
import java.io.StringReader;
36+
import java.io.StringWriter;
3637
import java.io.Writer;
3738
import java.util.AbstractMap;
3839
import java.util.Map;
@@ -328,6 +329,14 @@ public void close() {
328329
return dest;
329330
}
330331

332+
public static String toJsonString(JsonpSerializable value, JsonpMapper mapper) {
333+
StringWriter writer = new StringWriter();
334+
JsonGenerator generator = mapper.jsonProvider().createGenerator(writer);
335+
value.serialize(generator, mapper);
336+
generator.close();
337+
return writer.toString();
338+
}
339+
331340
/**
332341
* Renders a <code>JsonpSerializable</code> as a string in a destination <code>StringBuilder</code>by serializing it to JSON.
333342
* Any object of an application-specific class in the object graph is rendered using that object's <code>toString()</code>

0 commit comments

Comments
 (0)