Skip to content

Commit 23f5d22

Browse files
committed
toJson
1 parent 103d13b commit 23f5d22

File tree

16 files changed

+118
-42
lines changed

16 files changed

+118
-42
lines changed

api/all/src/main/java/io/opentelemetry/api/common/KeyValueList.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.api.common;
77

8+
import static java.util.stream.Collectors.joining;
9+
810
import java.util.ArrayList;
911
import java.util.Arrays;
1012
import java.util.Collections;
@@ -48,8 +50,15 @@ public List<KeyValue> getValue() {
4850

4951
@Override
5052
public String asString() {
53+
return value.stream()
54+
.map(item -> item.getKey() + "=" + item.getValue().asString())
55+
.collect(joining(", ", "[", "]"));
56+
}
57+
58+
@Override
59+
public String toProtoJson() {
5160
StringBuilder sb = new StringBuilder();
52-
JsonUtil.appendJsonValue(sb, this);
61+
ProtoJson.append(sb, this);
5362
return sb.toString();
5463
}
5564

api/all/src/main/java/io/opentelemetry/api/common/JsonUtil.java renamed to api/all/src/main/java/io/opentelemetry/api/common/ProtoJson.java

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -9,44 +9,43 @@
99
import java.util.Base64;
1010
import java.util.List;
1111

12-
/** Package-private utility for JSON encoding. */
13-
final class JsonUtil {
12+
final class ProtoJson {
1413

1514
private static final char[] HEX_DIGITS = {
1615
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
1716
};
1817

1918
@SuppressWarnings("unchecked")
20-
static void appendJsonValue(StringBuilder sb, Value<?> value) {
19+
static void append(StringBuilder sb, Value<?> value) {
2120
switch (value.getType()) {
2221
case STRING:
23-
appendJsonString(sb, (String) value.getValue());
22+
appendString(sb, (String) value.getValue());
2423
break;
2524
case LONG:
2625
sb.append(value.getValue());
2726
break;
2827
case DOUBLE:
29-
appendJsonDouble(sb, (Double) value.getValue());
28+
appendDouble(sb, (Double) value.getValue());
3029
break;
3130
case BOOLEAN:
3231
sb.append(value.getValue());
3332
break;
3433
case ARRAY:
35-
appendJsonArray(sb, (List<Value<?>>) value.getValue());
34+
appendArray(sb, (List<Value<?>>) value.getValue());
3635
break;
3736
case KEY_VALUE_LIST:
38-
appendJsonKeyValueList(sb, (List<KeyValue>) value.getValue());
37+
appendMap(sb, (List<KeyValue>) value.getValue());
3938
break;
4039
case BYTES:
41-
appendJsonBytes(sb, (ByteBuffer) value.getValue());
40+
appendBytes(sb, (ByteBuffer) value.getValue());
4241
break;
4342
case EMPTY:
4443
sb.append("null");
4544
break;
4645
}
4746
}
4847

49-
static void appendJsonString(StringBuilder sb, String value) {
48+
private static void appendString(StringBuilder sb, String value) {
5049
sb.append('"');
5150
for (int i = 0; i < value.length(); i++) {
5251
char c = value.charAt(i);
@@ -88,49 +87,46 @@ static void appendJsonString(StringBuilder sb, String value) {
8887
sb.append('"');
8988
}
9089

91-
private static void appendJsonDouble(StringBuilder sb, double value) {
90+
private static void appendDouble(StringBuilder sb, double value) {
9291
if (Double.isNaN(value)) {
93-
// Encoding as string to match ProtoJSON: https://protobuf.dev/programming-guides/json/
9492
sb.append("\"NaN\"");
9593
} else if (Double.isInfinite(value)) {
96-
// Encoding as string to match ProtoJSON: https://protobuf.dev/programming-guides/json/
9794
sb.append(value > 0 ? "\"Infinity\"" : "\"-Infinity\"");
9895
} else {
9996
sb.append(value);
10097
}
10198
}
10299

103-
private static void appendJsonBytes(StringBuilder sb, ByteBuffer value) {
104-
// Encoding as base64 to match ProtoJSON: https://protobuf.dev/programming-guides/json/
100+
private static void appendBytes(StringBuilder sb, ByteBuffer value) {
105101
byte[] bytes = new byte[value.remaining()];
106102
value.duplicate().get(bytes);
107103
sb.append('"').append(Base64.getEncoder().encodeToString(bytes)).append('"');
108104
}
109105

110-
private static void appendJsonArray(StringBuilder sb, List<Value<?>> values) {
106+
private static void appendArray(StringBuilder sb, List<Value<?>> values) {
111107
sb.append('[');
112108
for (int i = 0; i < values.size(); i++) {
113109
if (i > 0) {
114110
sb.append(',');
115111
}
116-
appendJsonValue(sb, values.get(i));
112+
append(sb, values.get(i));
117113
}
118114
sb.append(']');
119115
}
120116

121-
private static void appendJsonKeyValueList(StringBuilder sb, List<KeyValue> values) {
117+
private static void appendMap(StringBuilder sb, List<KeyValue> values) {
122118
sb.append('{');
123119
for (int i = 0; i < values.size(); i++) {
124120
if (i > 0) {
125121
sb.append(',');
126122
}
127123
KeyValue kv = values.get(i);
128-
appendJsonString(sb, kv.getKey());
124+
appendString(sb, kv.getKey());
129125
sb.append(':');
130-
appendJsonValue(sb, kv.getValue());
126+
append(sb, kv.getValue());
131127
}
132128
sb.append('}');
133129
}
134130

135-
private JsonUtil() {}
131+
private ProtoJson() {}
136132
}

api/all/src/main/java/io/opentelemetry/api/common/Value.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,31 @@ static Value<Void> empty() {
120120
* <p>WARNING: No guarantees are made about the encoding of this string response. It MAY change in
121121
* a future minor release. If you need a reliable string encoding, write your own serializer.
122122
*/
123-
// TODO(jack-berg): Should this be a JSON encoding?
123+
// TODO deprecate in favor of toString() or toProtoJson()?
124124
String asString();
125+
126+
/**
127+
* Returns a JSON encoding of this {@link Value}.
128+
*
129+
* <p>The output follows the <a href="https://protobuf.dev/programming-guides/json/">ProtoJSON</a>
130+
* specification:
131+
*
132+
* <ul>
133+
* <li>{@link ValueType#STRING} JSON string (including escaping and surrounding quotes)
134+
* <li>{@link ValueType#BOOLEAN} JSON boolean ({@code true} or {@code false})
135+
* <li>{@link ValueType#LONG} JSON number
136+
* <li>{@link ValueType#DOUBLE} JSON number, or {@code "NaN"}, {@code "Infinity"}, {@code
137+
* "-Infinity"} for special values
138+
* <li>{@link ValueType#ARRAY} JSON array (e.g. {@code [1,"two",true]})
139+
* <li>{@link ValueType#KEY_VALUE_LIST} JSON object (e.g. {@code {"key1":"value1","key2":2}})
140+
* <li>{@link ValueType#BYTES} JSON string (including surrounding double quotes) containing
141+
* base64 encoded bytes
142+
* <li>{@link ValueType#EMPTY} JSON {@code null} (the string {@code "null"} without the
143+
* surrounding quotes)
144+
* </ul>
145+
*
146+
* @return a JSON encoding of this value
147+
*/
148+
// TODO does this need a default implementation?
149+
String toProtoJson();
125150
}

api/all/src/main/java/io/opentelemetry/api/common/ValueArray.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55

66
package io.opentelemetry.api.common;
77

8+
import static java.util.stream.Collectors.joining;
9+
810
import java.util.ArrayList;
911
import java.util.Arrays;
1012
import java.util.Collections;
@@ -42,8 +44,13 @@ public List<Value<?>> getValue() {
4244

4345
@Override
4446
public String asString() {
47+
return value.stream().map(Value::asString).collect(joining(", ", "[", "]"));
48+
}
49+
50+
@Override
51+
public String toProtoJson() {
4552
StringBuilder sb = new StringBuilder();
46-
JsonUtil.appendJsonValue(sb, this);
53+
ProtoJson.append(sb, this);
4754
return sb.toString();
4855
}
4956

api/all/src/main/java/io/opentelemetry/api/common/ValueBoolean.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@ public Boolean getValue() {
3131

3232
@Override
3333
public String asString() {
34+
return String.valueOf(value);
35+
}
36+
37+
@Override
38+
public String toProtoJson() {
3439
StringBuilder sb = new StringBuilder();
35-
JsonUtil.appendJsonValue(sb, this);
40+
ProtoJson.append(sb, this);
3641
return sb.toString();
3742
}
3843

api/all/src/main/java/io/opentelemetry/api/common/ValueBytes.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77

88
import java.nio.ByteBuffer;
99
import java.util.Arrays;
10+
import java.util.Base64;
1011
import java.util.Objects;
1112

1213
final class ValueBytes implements Value<ByteBuffer> {
@@ -34,8 +35,13 @@ public ByteBuffer getValue() {
3435

3536
@Override
3637
public String asString() {
38+
return Base64.getEncoder().encodeToString(raw);
39+
}
40+
41+
@Override
42+
public String toProtoJson() {
3743
StringBuilder sb = new StringBuilder();
38-
JsonUtil.appendJsonValue(sb, this);
44+
ProtoJson.append(sb, this);
3945
return sb.toString();
4046
}
4147

api/all/src/main/java/io/opentelemetry/api/common/ValueDouble.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@ public Double getValue() {
3131

3232
@Override
3333
public String asString() {
34+
return String.valueOf(value);
35+
}
36+
37+
@Override
38+
public String toProtoJson() {
3439
StringBuilder sb = new StringBuilder();
35-
JsonUtil.appendJsonValue(sb, this);
40+
ProtoJson.append(sb, this);
3641
return sb.toString();
3742
}
3843

api/all/src/main/java/io/opentelemetry/api/common/ValueEmpty.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public Void getValue() {
2727

2828
@Override
2929
public String asString() {
30+
return "";
31+
}
32+
33+
@Override
34+
public String toProtoJson() {
3035
return "null";
3136
}
3237

api/all/src/main/java/io/opentelemetry/api/common/ValueLong.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,13 @@ public Long getValue() {
3131

3232
@Override
3333
public String asString() {
34+
return String.valueOf(value);
35+
}
36+
37+
@Override
38+
public String toProtoJson() {
3439
StringBuilder sb = new StringBuilder();
35-
JsonUtil.appendJsonValue(sb, this);
40+
ProtoJson.append(sb, this);
3641
return sb.toString();
3742
}
3843

api/all/src/main/java/io/opentelemetry/api/common/ValueString.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,13 @@ public String getValue() {
3232

3333
@Override
3434
public String asString() {
35+
return value;
36+
}
37+
38+
@Override
39+
public String toProtoJson() {
3540
StringBuilder sb = new StringBuilder();
36-
JsonUtil.appendJsonValue(sb, this);
41+
ProtoJson.append(sb, this);
3742
return sb.toString();
3843
}
3944

0 commit comments

Comments
 (0)