View Javadoc

1   package com.atlassian.asap.nimbus.serializer;
2   
3   import net.minidev.json.JSONArray;
4   import net.minidev.json.JSONObject;
5   
6   import javax.json.JsonArray;
7   import javax.json.JsonNumber;
8   import javax.json.JsonObject;
9   import javax.json.JsonString;
10  import javax.json.JsonValue;
11  import java.util.Map;
12  
13  /**
14   * Translates JSR 353 objects into the Nimbus (net.minidev.json) representation.
15   */
16  class Jsr353NimbusTranslator {
17      static Object jsr353ToNimbus(JsonValue jsonValue) {
18          switch (jsonValue.getValueType()) {
19              case NULL:
20                  return null;
21              case STRING:
22                  return ((JsonString) jsonValue).getString();
23              case NUMBER:
24                  return convertNumber((JsonNumber) jsonValue);
25              case TRUE:
26                  return Boolean.TRUE;
27              case FALSE:
28                  return Boolean.FALSE;
29              case ARRAY:
30                  return convertArray((JsonArray) jsonValue);
31              case OBJECT:
32                  return convertObject((JsonObject) jsonValue);
33              default:
34                  throw new IllegalStateException("Broken JSON");
35          }
36      }
37  
38      private static Object convertNumber(JsonNumber jsonNumber) {
39          // Do not use the ternary operator. Type inference gets horribly confused and always returns Double.
40          if (jsonNumber.isIntegral()) {
41              return jsonNumber.longValueExact();  // won't work for big integers
42          } else {
43              return jsonNumber.doubleValue();
44          }
45      }
46  
47      private static Object convertArray(JsonArray jsonValue) {
48          JSONArray nimbusArray = new JSONArray();
49          for (JsonValue arrayElement : jsonValue) {
50              nimbusArray.add(jsr353ToNimbus(arrayElement));
51          }
52          return nimbusArray;
53      }
54  
55      private static Object convertObject(JsonObject jsonValue) {
56          JSONObject nimbusObject = new JSONObject();
57          for (Map.Entry<String, JsonValue> entry : jsonValue.entrySet()) {
58              nimbusObject.put(entry.getKey(), jsr353ToNimbus(entry.getValue()));
59          }
60          return nimbusObject;
61      }
62  }