繁体   English   中英

如何使用关联数组解析 application/x-www-form-urlencoded?

[英]How to parse a application/x-www-form-urlencoded with an associative array?

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

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 将其转换为 object。

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

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

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

注意: ID/令牌不是真实的。 它们来自文档片段。

反序列化为 Map 并使用 json 序列化/反序列化为 object

  1. 最初将输入反序列化为Map<String, String>
  2. 使用 Json 处理器(如ObjectMapperGson )序列化上一步构建的Map
  3. 使用 json 处理器将上一步的 json output 反序列化为自定义 ZA8CFDE6331BD59EB2AC96F8911
    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);
    }

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM