JwtBuilder добавить \ в мою строку Json - Java

У меня есть строка JSON (созданная Джексоном для преобразования объекта):

String my_JSON_String = {"id":-1,"id_contratto":1,"datetime_inizio":"2018-09-15 17:44:02","datetime_fine":null,"numero_chiamate_individuali":-1,"minuti_totali_chiamate_individuali":1421,"numero_chiamate_gruppo":3027,"minuti_totali_chiamate_gruppo":-1,"numero_messaggi_individuali_testo":-1,"numero_messaggi_individuali_multimediali":-1,"numero_messaggi_gruppo_testo":-1,"numero_messaggi_gruppo_multimediali":-1,"numero_eventi_inviati":-1,"numero_interventi_creati":-1,"enabled":false}

Я должен поместить эту строку в настраиваемое поле под названием «DATI» утверждения JWT. Я использую:

JwtBuilder MY_JwtBuilder = Jwts.builder()
                .setIssuedAt( new Date() )
                .setIssuer("Fausto")
                .setSubject("Ciao")
                .claim("DATI", my_JSON_String ) 
                .signWith(SignatureAlgorithm.HS256, "DonalDuck");
String JWT=  MY_JwtBuilder.compact();

Если я тестирую JWT, помещая его в https://jwt.io/, я получаю следующую строку:

{
  "iat": 1537026243,
  "iss": "Fausto",
  "sub": "Ciao",
  "DATI": "{\"id\":-1,\"id_contratto\":1,\"datetime_inizio\":\"2018-09-15 17:44:02\",\"datetime_fine\":null,\"numero_chiamate_individuali\":-1,\"minuti_totali_chiamate_individuali\":1421,\"numero_chiamate_gruppo\":3027,\"minuti_totali_chiamate_gruppo\":-1,\"numero_messaggi_individuali_testo\":-1,\"numero_messaggi_individuali_multimediali\":-1,\"numero_messaggi_gruppo_testo\":-1,\"numero_messaggi_gruppo_multimediali\":-1,\"numero_eventi_inviati\":-1,\"numero_interventi_creati\":-1,\"enabled\":false}",
  "exp": 1537029843
}

Для каждой кавычки в поле DATI был добавлен \. Это проблема на стороне веб-сайта. Как избежать добавления \?

Спасибо, Фаусто

@benjamin c Может быть, ты здесь поможешь?

Fausto70 17.09.2018 08:21

Я думаю, что первая строка не может быть вашим настоящим кодом, это не строка. Я полагаю, вы производите его с помощью JSONObject.getString() или чего-то подобного, или вы пропустили прилагаемый "", верно ?!

jps 17.09.2018 10:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
680
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать String#replaceAll() с шаблоном ^\"|\"$

Например.

String JWT = MY_JwtBuilder.compact().replaceAll("^\"|\"$", "");

JWT зашифрован, это что-то вроде "eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzcwMjczMjcsImlzcyI6Imh0dH A6Ly9mcDJ0ZWNoLml0Ly IsInN1YiI6IkVUSVAvbn VsbCIsIkRBVEkiOiJ7J2 lkJzotMSwnaWRfY29udH JhdHRvJzoyLCdkYXRldG ltZV9pbml6aW8nOicyMD E4LTA5LTE1IDE4OjAyOj A3JywnZGF0ZXRpbWVfZm luZSc6bnVsbCwnbnVtZX JvX2NoaWFtYXRlX2luZG l2aWR1YWxpJzotMSwnbW ludXRpX3RvdGFsaV9jaG lhbWF0ZV9pbmRpdmlkdW FsaSc6Mjk4MCwnbnVtZX JvX2NoaWFtYXRl ...."; подстановка в зашифрованной строке не имеет никакого смысла.

Fausto70 16.09.2018 23:03
Ответ принят как подходящий

Проблема здесь в том, что вы уже создали строку из своего объекта DATI. JWTBuilder обрабатывает его как строку и экранирует " внутри с помощью \.

Вместо того, чтобы создавать JSON-String самостоятельно, создайте объект JSON и передайте этот объект в качестве параметра в claim, и пусть JWTBuilder позаботится о правильной сериализации этого объекта, например.:

JSONObject datiClaim = new JSONObject();
datiClaim.put("id", -1);
datiClaim.put("id_contratto", 1);

...

JwtBuilder MY_JwtBuilder = Jwts.builder()
            .setIssuedAt( new Date() )
            .setIssuer("Fausto")
            .setSubject("Ciao")
            .claim("DATI", datiClaim ) 
....

Я попробую, но в этом случае у меня другая проблема: есть ли способ создать JSONObject с помощью универсального объекта? Я имею в виду, что объект, который я должен отправить в JWT, мог принадлежать к разным классам. Есть ли способ сделать это? Например, я получаю строку Json от библиотеки Джексона, начиная с любого объекта ... Могу ли я сделать то же самое, чтобы создать объект JSON?

Fausto70 17.09.2018 13:35

В любом случае, помимо другой проблемы в моем комментарии, ваше решение работает !!!

Fausto70 17.09.2018 14:41

Согласно документы вторым параметром claim может быть что угодно типа object, поэтому в основном вам даже не нужен JSONObject, но вы можете напрямую передавать любой другой тип объекта.

jps 17.09.2018 16:34

@jps Это действительно так, спасибо за этот комментарий. Нет необходимости конвертировать его в json, он принимает любой объект Java.

Daenerys 14.09.2019 01:26

Другие вопросы по теме