将JSON对象作为GET参数

1 投票
1 回答
7393 浏览
提问于 2025-04-16 08:16

我正在为一个Mongo数据库编写API。我需要把一个JSON对象作为GET参数传递:

example.com/api/obj/list/1/?find={"foo":"bar"}

我应该怎么更好地组织这个呢?

我考虑过使用没有引号和空格的类似JSON的对象,比如:

{$or:[{a:foo+bar},{b:2}]}

那么在Python/Django中有没有工具可以解析它呢?

1 个回答

3

只要你的JSON对象不太大,里面没有敏感信息(比如在浏览器历史记录中看到自己的密码可就糟糕了),并且你对它们进行了URL编码,那就没问题。

不过,如果你想让JSON参数更容易被人看懂,就得走一些捷径。所有的JSON括号({}[])都建议进行编码。虽然不编码也可以,但这样做就有风险。更麻烦的是:,这个符号在JSON中随处可见,必须进行编码。

如果你想要人类可读的查询字符串,最合理的做法就是明确地对所有查询参数进行编码。一个可能效果不错的折中方案是,把顶层的JSON对象拆分成明确的查询参数,每个参数仍然保持JSON编码。再进一步,你可以去掉任何剩余的顶层分隔符,比如:

JSON: {"foo":"bar", "items":[1, 2, 3], "staff":{"id":432, "first":"John", "last":"Doe"}}
Query: foo=bar&items=1,2,3&staff="id"%3A432,"first"%3A"John","last"%3A"Doe"

因为你知道foo是一个字符串,items是一个数组,staff是一个对象,所以在把这些数据发送给JSON解析器之前,你可以正确地恢复JSON语法。

撰写回答