为啥下面两个字符串之一被视为 JSON 数组而另一个被视为字符串? Python

Posted

技术标签:

【中文标题】为啥下面两个字符串之一被视为 JSON 数组而另一个被视为字符串? Python【英文标题】:Why is one of the two strings below considered as a JSON array and the other one as a string? Python为什么下面两个字符串之一被视为 JSON 数组而另一个被视为字符串? Python 【发布时间】:2021-10-26 02:25:39 【问题描述】:

我正在尝试发出 PUT 请求,而 API 端点要求负载的结构如下:

payload_test = "[\"id\": 1, \"channel_id\": 1, \"entity_type\": \"product\", \"entity_id\": 123, \"file_name\": \"custom-product-1.html\"]"

我已从 CSV 文件导入值,以使用 pandas 和一些字符串操作创建类似的字符串响应。这是我打印字符串时的输出:

my_string = "[\"id\": 1, \"channel_id\": 1, \"entity_type\": \"product\", \"entity_id\": 123, \"file_name\": \"product-custom-options.html\"]"

我创建了my_string 以与原始有效负载请求相同,但是当我传递 my_string 时收到以下错误:请求有效负载必须是端点的 JSON 数组

当我传递payload_test 变量时,api 调用成功

这就是我创建my_string 字符串的方式:

id、channel_id 等的值是从数据帧(最初是一个 csv 文件)中获得的。

id channel_id entity_type entity_id file_name
1 1 product 123 custom-product-1.html
2 2 product 234 custom-product-1.html
df = pd.read_csv('xyz.csv')

for trial in df[['id', 'channel_id', 'entity_type', 'entity_id', 'file_name']].agg(pd.Series.to_json, axis='columns'):

    string1 = json.dumps(trial)

    my_string = string1[:1] + '[' + string1[1:-1] + ']"' #adding [ and ]" to the beginning and end

    my_string = my_string.replace(':', ': ')   #adding spaces after :

    my_string = my_string.replace(',', ', ')   #adding spaces after ,

    update_template(my_string, headers)
    

当我打印两个字符串的类型时,它是:<class 'str'>

【问题讨论】:

【参考方案1】:

因为pd.Series.to_json 返回一个字符串,而不是一个类似 JSON 的对象(在这种情况下应该是一个 dict)。来自documentation:

pandas.Series.to_json 将对象转换为 JSON 字符串。

在字符串上调用json.dumps 将其括在一对双引号中,然后搞砸一切。试试这个:

for trial in df[['id', 'channel_id', 'entity_type', 'entity_id', 'file_name']].agg(pd.Series.to_json, axis='columns'):
    my_string = f'[trial]'.replace(':', ': ').replace(',', ', ')

这两个replaces 不是必需的,甚至可能会干扰字段的内容。

【讨论】:

这行得通。你能解释一下 f'[trial]' 的作用吗?谢谢 是字符串插值。一个更好的例子是不用写greeting = 'Hello ' + name +'. Welcome to the year ' + str(year),你可以写greeting = f'Hello name. Welcome to the year year'。阅读 f-strings。

以上是关于为啥下面两个字符串之一被视为 JSON 数组而另一个被视为字符串? Python的主要内容,如果未能解决你的问题,请参考以下文章

为啥 iloc() 的一种使用会给出 SettingWithCopyWarning,而另一种则不会?

困惑为啥在Objective C中一段代码有效而另一段代码无效

为啥我的 Material UI 自动完成元素之一的选项具有蓝色背景,而另一个没有? (包括代码沙箱)

双指针法

双指针法

SQL bigint 数据类型被 gettype() 视为字符串;功能。为啥?