【问题标题】:JwtBuilder add \ to my Json String - JavaJwtBuilder 将 \ 添加到我的 Json 字符串 - Java
【发布时间】:2019-02-20 15:22:37
【问题描述】:

我有一个 JSON 字符串(由 Jackson 制作,用于转换对象):

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}

我必须将此字符串放在 JWT 声明的名为“DATI”的自定义字段中。我用:

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 你能帮忙吗?
  • 我认为第一行不可能是你的真实代码,那不是字符串。我猜你是用JSONObject.getString() 或类似的东西生成的,或者你省略了封闭的"",对吧?!

标签: java json jackson jwt


【解决方案1】:

这里的问题是,您已经从 DATI 对象创建了一个字符串。 JWTBuilder 将其视为字符串,并使用 \ 转义内部的 "

与其自己创建 JSON 字符串,不如创建一个 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 中发送的对象可以是不同类别的我。有没有办法做到这一点?例如,我从 Jackson 库获取 I Json String 从任何对象开始......我可以做同样的事情来创建 JSON 对象吗?
  • 无论如何,除了我评论中的其他问题,您的解决方案有效!!!
  • 根据docsclaim的第二个参数可以是object类型的任何东西,所以基本上你甚至不需要JSONObject但可以直接传递任何其他对象类型.
  • @jps 这其实是真的,谢谢你的评论。不需要转成json,可以接受任何Java对象。
【解决方案2】:

您可以将String#replaceAll()^\"|\"$ 模式一起使用

例如

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

【讨论】:

  • JWT是加密的,大概是 “eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE1MzcwMjczMjcsImlzcyI6Imh0dHA6Ly9mcDJ0ZWNoLml0LyIsInN1YiI6IkVUSVAvbnVsbCIsIkRBVEkiOiJ7J2lkJzotMSwnaWRfY29udHJhdHRvJzoyLCdkYXRldGltZV9pbml6aW8nOicyMDE4LTA5LTE1IDE4OjAyOjA3JywnZGF0ZXRpbWVfZmluZSc6bnVsbCwnbnVtZXJvX2NoaWFtYXRlX2luZGl2aWR1YWxpJzotMSwnbWludXRpX3RvdGFsaV9jaGlhbWF0ZV9pbmRpdmlkdWFsaSc6Mjk4MCwnbnVtZXJvX2NoaWFtYXRl ......”;加密字符串中的替换没有任何意义。
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 2011-09-10
  • 2014-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多