使用JSONObject和JSONArray构建JSON Web令牌

时间:2015-09-17 08:49:06

标签: java json jwt

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

std::less<>

我尝试使用以下代码实现它

"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数组时未调用它们,则结果为[{}]

打印到控制台时,tax数组字符串的最终结果是["{\"VAT\":\"[{},{}]\"}"]

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

问题

构建我想要创建的结构的正确方法是什么?

看起来{"VAT":"[\"{\\\"Amount\\\":100,\\\"TaxRate\\\":\\\"A\\\"}\",\"{\\\"Amount\\\":300,\\\"TaxRate\\\":\\\"B\\\"}\"]"}方法正在转义引号并添加斜杠。这种有效负载不能在请求中使用,因为服务器端应用程序无法解析它。

1 个答案:

答案 0 :(得分: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"}]}]}