private static void addMapField(final JsonObjectBuilder json, final Message msg, final Descriptors.FieldDescriptor field) { final JsonObjectBuilder map = Json.createObjectBuilder(); final List<MapEntry<String, Object>> mapEntries = (List<MapEntry<String, Object>>) msg.getField(field); mapEntries.forEach(entry -> { final Object value = entry.getValue(); if (value instanceof Message) { map.add(entry.getKey(), protobuMessageToJson((Message) value)); } else if (value instanceof String) { map.add(entry.getKey(), (String) value); } else if (value instanceof Integer) { map.add(entry.getKey(), (Integer) value); } else if (value instanceof Long) { map.add(entry.getKey(), (Long) value); } else if (value instanceof Double) { map.add(entry.getKey(), (Double) value); } else if (value instanceof Float) { map.add(entry.getKey(), (Float) value); } else if (value instanceof Boolean) { map.add(entry.getKey(), (Boolean) value); } else if (value instanceof ByteString) { map.add(entry.getKey(), Base64.getEncoder().encodeToString(((ByteString) value).toByteArray())); } }); json.add(field.getName(), map); }