【问题标题】:How to parse a application/x-www-form-urlencoded with an associative array?如何使用关联数组解析 application/x-www-form-urlencoded?
【发布时间】:2021-05-19 20:28:24
【问题描述】:

我正在尝试解析以下正文:

event=invoice.created&data%5Bid%5D=1757E1D7FD5E410A9C563024250015BF&
data%5Bstatus%5D=pending&data%5Baccount_id%5D=70CA234077134ED0BF2E0E46B0EDC36F&
data%5Bsubscription_id%5D=F4115E5E28AE4CCA941FCCCCCABE9A0A

翻译为:

event = invoice.created
data[id] = 1757E1D7FD5E410A9C563024250015BF
data[status] = pending
data[account_id] = 70CA234077134ED0BF2E0E46B0EDC36F
data[subscription_id] = F4115E5E28AE4CCA941FCCCCCABE9A0A

代码:

@PostMapping(consumes = [MediaType.APPLICATION_FORM_URLENCODED_VALUE])
fun cb(event: SubscriptionRenewed)
{
    println(event)
}

data class SubscriptionRenewed(
    val event: String,
    val data: Data
)

data class Data(
    val id: String,
    val status: String,
    val account_id: String,
    val subscription_id: String
)

通常您只需创建传入主体的 POJO 表示,然后 spring a 将其转换为对象。

我了解到我可以将所有参数添加到函数声明中作为 @RequestParam("data[id]") id: String,但这会使事情变得非常冗长。

问题在于解析data[*],如何使其工作的想法?

编辑: 我发现如果我将val data: Data 更改为val data: Map<String, String> = HashMap(),关联数组将正确插入到映射中,如何将其映射到对象的想法?

注意: ID/令牌不是真实的。它们来自文档 sn-p。

【问题讨论】:

  • 一个建议:收集为 Map 并使用 json 序列化和反序列化对象可以吗?
  • 这就是我最终做的事情,但当你想到 spring 如何处理其他输入类型时,感觉就像一个奇怪的样板。

标签: java spring spring-boot spring-mvc kotlin


【解决方案1】:

反序列化为Map并使用json序列化/反序列化为对象

  1. 最初将输入反序列化为Map<String, String>
  2. 使用Json处理器(如ObjectMapperGson)序列化上一步构造的Map
  3. 使用 json 处理器将上一步的 json 输出反序列化为自定义对象。
    static class Data {
        private String one;
        private String a;

        @Override
        public String toString() {
            return "Data{one=" + one + ", a=" + a + "}";
        }
    }

    public static void main(String[] args) {
        String input = "{\"one\":1, \"a\":\"B\"}";
        Gson gson = new GsonBuilder().create();
        Map<String, String> map = gson.fromJson(input, new TypeToken<Map<String, String>>(){}.getType());
        Data data = gson.fromJson(gson.toJson(map), Data.class);
        System.out.println(data);
    }

这肯定是一个回合的方法,我不知道有任何优化

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2016-10-17
    • 2014-03-30
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多