使用 JSONObject 和 JSONArray 构建 JSON Web Token
Building JSON Web Token using JSONObject and JSONArray
我正在使用 JSONObject 和 JSONArray 构建 JSON Web Token (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\":\"[{},{}]\"}"]
.
taxs 数组字符串打印到控制台的最终结果是 ["{\"VAT\":\"[\\"{\\\\"Amount\\\\":100,\\\\"TaxRate\\\\":\\\\"A\\\\"}\\",\\"{\\\\"Amount\\\\":300,\\\\"TaxRate\\\\":\\\\"B\\\\"}\\"]\"}"]
。
但是,vat 数组包含没有反斜杠的元素,例如。 {"Amount":100,"TaxRate":"A"}
。 taxes 数组有一个条目,看起来像 {"VAT":"[\"{\\"Amount\\":100,\\"TaxRate\\":\\"A\\"}\",\"{\\"Amount\\":300,\\"TaxRate\\":\\"B\\"}\"]"}
问题
构建我要创建的结构的正确方法是什么?
看起来 toString()
方法正在转义引号并添加斜杠。这种负载不能用于请求,因为服务器端应用程序无法解析它。
Nimbus Jose 在内部使用 json-smart。因此,导入语句应如下所示:
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"}]}]}
我正在使用 JSONObject 和 JSONArray 构建 JSON Web Token (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\":\"[{},{}]\"}"]
.
taxs 数组字符串打印到控制台的最终结果是 ["{\"VAT\":\"[\\"{\\\\"Amount\\\\":100,\\\\"TaxRate\\\\":\\\\"A\\\\"}\\",\\"{\\\\"Amount\\\\":300,\\\\"TaxRate\\\\":\\\\"B\\\\"}\\"]\"}"]
。
但是,vat 数组包含没有反斜杠的元素,例如。 {"Amount":100,"TaxRate":"A"}
。 taxes 数组有一个条目,看起来像 {"VAT":"[\"{\\"Amount\\":100,\\"TaxRate\\":\\"A\\"}\",\"{\\"Amount\\":300,\\"TaxRate\\":\\"B\\"}\"]"}
问题
构建我要创建的结构的正确方法是什么?
看起来 toString()
方法正在转义引号并添加斜杠。这种负载不能用于请求,因为服务器端应用程序无法解析它。
Nimbus Jose 在内部使用 json-smart。因此,导入语句应如下所示:
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"}]}]}