JSON entity mapping

The Nimbus JOSE+JWT library applies an intuitive mapping between JSON entities and their natural Java class counterparts.

JSON Java
string java.lang.String
number java.lang.Number
true / false java.lang.Boolean
JSON array java.util.List<Object>
JSON object java.util.Map<String, Object>
null null

This mapping is applied when the underlying JSON library (GSon) serialises and parses JSON entities in JOSE headers and payloads / JWT claims sets.

Don't serialise instances of other classes, even if GSon is able to do that, as it can lead to unpredictable results. Convert such Java objects to one of the mappings above and then pass them to a JWTClaimsSet or where needed.

When dealing with a JWTClaimSet and standard claims, such as iss or exp, aim to use the standard typed getters / setters.

JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
    .issuer("https://example.com")
    .expirationTime(Date.from(Instant.now().plusSeconds(60)))
    .build();

When a standard typed setter isn't available, use the general JWTClaimsSet.Builder claim method. The claim value must map to its JSON entity.

Example JWT claims set building:

String stringClaim = "string";

long intClaim = 10L;

double decimalFractionClaim = 3.14;

boolean boolClaim = true;

List<Object> jsonArrayClaim = Arrays.asList((Object)"a", true, 66);

Map<String, Object> jsonObjectClaim = new HashMap<>();
jsonObjectClaim.put("member-1", "a");
jsonObjectClaim.put("member-2", true);
jsonObjectClaim.put("member-3", 66);

// Construct the JWT claims
JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
    .claim("string", stringClaim)
    .claim("int", intClaim)
    .claim("decimal_fraction", decimalFractionClaim)
    .claim("bool", boolClaim)
    .claim("json_array", jsonArrayClaim)
    .claim("json_object", jsonObjectClaim)
    .build();

// Serialise to JSON
String json = claimsSet.toString();

System.out.println(json);

The serialised JSON:

{
  "string": "string",
  "bool": true,
  "int": 10,
  "decimal_fraction": 3.14,
  "json_array": [
    "a",
    true,
    66
  ],
  "json_object": {
    "member-1": "a",
    "member-2": true,
    "member-3": 66
  }
}

To parse the above JWT claims set back:

// Parse the JWT claims
JWTClaimsSet claimsSet = JWTClaimsSet.parse(json);

// Extract the individual claims
String stringClaim                  = claimsSet.getStringClaim("string");
Long intClaim                       = claimsSet.getLongClaim("int");
Boolean boolClaim                   = claimsSet.getBooleanClaim("bool");
Double decimalFractionClaim         = claimsSet.getDoubleClaim("decimal_fraction");
List<Object> jsonArrayClaim         = claimsSet.getListClaim("json_array");
Map<String, Object> jsonObjectClaim = claimsSet.getJSONObjectClaim("json_object");

// Extract the json_object members
String memberA  = JSONObjectUtils.getString(jsonObjectClaim, "member-1");
boolean memberB = JSONObjectUtils.getBoolean(jsonObjectClaim, "member-2");
long memberC    = JSONObjectUtils.getLong(jsonObjectClaim, "member-3");