使用 JSONObject 和 JSONArray 构建 JSON Web Token

Posted

技术标签:

【中文标题】使用 JSONObject 和 JSONArray 构建 JSON Web Token【英文标题】:Building JSON Web Token using JSONObject and JSONArray 【发布时间】:2015-12-14 01:47:25 【问题描述】:

我正在使用 JSONObject 和 JSONArray 构建 JSON Web 令牌 (JWT)。创建有效负载时,我需要匹配以下部分(包含数组的数组)

"Taxes":
[
   "VAT": [ "TaxRate": "A", "Amount": 100 ,  "TaxRate": "B", "Amount": 300 ]
]

我尝试用下面的代码来实现它

JSONArray taxes= new JSONArray();
JSONArray vat = new JSONArray();
vat.add(new JSONObject()
        .put("TaxRate", "A")
        .put("Amount", 100).toString());
vat.add(new JSONObject()
        .put("TaxRate", "B")
        .put("Amount", 300).toString());
taxes.add(new JSONObject()
         .put("VAT", vat).toString());

问题

如果根本不调用toString() 方法,则结果为[]。如果在添加到 vat 数组时未调用它们,则结果为 ["\"VAT\":\"[,]\""]

tax 数组字符串打印到控制台时的最终结果是["\"VAT\":\"[\\\"\\\\\\\"Amount\\\\\\\":100,\\\\\\\"TaxRate\\\\\\\":\\\\\\\"A\\\\\\\"\\\",\\\"\\\\\\\"Amount\\\\\\\":300,\\\\\\\"TaxRate\\\\\\\":\\\\\\\"B\\\\\\\"\\\"]\""]

但是,vat 数组包含没有反斜杠的元素,例如。 "Amount":100,"TaxRate":"A"。 tax 数组有一个条目,看起来像 "VAT":"[\"\\\"Amount\\\":100,\\\"TaxRate\\\":\\\"A\\\"\",\"\\\"Amount\\\":300,\\\"TaxRate\\\":\\\"B\\\"\"]"

问题

构建我正在尝试创建的结构的正确方法是什么?

看起来toString() 方法正在转义引号并添加斜杠。这种负载不能用于请求,因为服务器端应用程序无法解析它。

【问题讨论】:

你使用什么样的框架将对象序列化为 json? 也许尝试分别创建每个 JSON 对象(而不是直接添加)并将对象记录到控制台。使用 .toString() 添加对象并不好,基本上会破坏内部对象。 @ErnestSadykov:JSONObject 是 json-jena 1.0,而 JSONArray 是 nimbus-jose-jwt 3.4。 【参考方案1】:

Nimbus Jose 在内部使用json-smart。因此,import 语句应如下所示:

import net.minidev.json.JSONArray;
import net.minidev.json.JSONObject;

创建json结构的代码:

JSONArray taxes= new JSONArray();
JSONArray vat = new JSONArray();
JSONObject a = new JSONObject();
a.put("TaxRate", "A");
a.put("Amount", 100);
vat.add(a);

JSONObject b = new JSONObject();
b.put("TaxRate", "B");
b.put("Amount", 300);
vat.add(b);

JSONObject vatObject = new JSONObject();
vatObject.put("VAT", vat);
taxes.add(vatObject);

JSONObject taxesObject = new JSONObject();
taxesObject.put("Taxes", taxes);

// generate string:
System.out.println(taxesObject.toJSONString());

// or create JWT:
new JWSObject(new JWSHeader(...), new Payload(taxesObject))

输出:

"Taxes":["VAT":["Amount":100,"TaxRate":"A","Amount":300,"TaxRate":"B"]]

【讨论】:

糟糕,我使用的是混合导入。但是,我决定使用 org.json 包中的所有内容,因为我喜欢链接选项。

以上是关于使用 JSONObject 和 JSONArray 构建 JSON Web Token的主要内容,如果未能解决你的问题,请参考以下文章

JSONArray和JSONObject的简单使用

使用 JSONObject 和 JSONArray 构建 JSON Web Token

JSONObject与JSONArray的使用

Android中的JSONObject和JSONArray的使用

JSONObject 和 JSONArray 的区别

使用 JSONObject 和 JSONArray 创建 json 字符串