这是什么类型的JSON对象? (Gitlab API),(Python)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了这是什么类型的JSON对象? (Gitlab API),(Python)相关的知识,希望对你有一定的参考价值。
我使用GitLab的文件存储库API访问文件的内容,并且在我点击一个特定文件(任何文本文件)之前似乎一切正常。
{:file_name=>"requirements.txt", :file_path=>"requirements.txt", :size=>30, :encoding=>"base64", :content=>"ImZsYXNrIgoidXdzZ2kiCiJnb2dvc2VjcmV0cyIK", :ref=>"master", :blob_id=>"7f551dddd4fd8931419450fb357bad83d2efbe6a", :commit_id=>"40e161fcb323be28259712a6cf5da8fddfda80e1", :last_commit_id=>"40e161fcb323be28259712a6cf5da8fddfda80e1"}
我从未在键之前看过冒号,并且从未在JSON对象中看到过“=>”。返回的所有其他JSON对象都没问题。对API的请求没有错,因为正在返回200响应。
这是什么??
答案
这似乎是Gitlab中的一个漏洞。见https://gitlab.com/gitlab-org/gitlab-ee/issues/2298。
当前的bug行为是什么?
响应:
{:file_path=>"Readme.txt", :branch=>"master"}
什么是预期的正确行为?
响应:
{"file_name": "Readme.txt", "branch": "master"}
另一答案
这个问题仍然在gitlab上开启(issue 2298)
我遇到了同样的问题。我确认只有.txt
文件受到影响。 Git扩展名未知的文件不受影响(例如:.myFile
,.unknowExtension
......)
这可以使用Content-Type
标头检测,当Gitlab在ruby hash中发送响应时设置为text / plain。
这是一个在PHP中解析ruby哈希的简单函数。
function ruby_hash_decode($ruby)
{
if (substr( $ruby, 0, 2 ) === "{:") {
$ruby = str_replace('{:', '{"', $ruby);
$ruby = str_replace('", :', '", "', $ruby);
$ruby = str_replace(', :', ', "', $ruby);
$ruby = str_replace('=>"', '":"', $ruby);
$ruby = str_replace('=>', '":', $ruby);
$ruby = json_decode($ruby);
}
return $ruby;
}
另一答案
为Python dict或json转换器创建Ruby哈希。注意,下面的解决方案是我在2分钟内做出的快速肮脏的解决方案。如果使用正则表达式,您可以做得更好。
s = '{:file_path=>"Readme.txt", :branch=>"master"}'
s = s[1:-1]
s = s.split(',')
s = [elem.strip() for elem in s]
s = [subs[1:] for subs in s]
s = [subs.replace('"', '') for subs in s]
my_dict = {elem.split('=>')[0]: elem.split('=>')[1] for elem in s}
my_dict
现在看起来像这样:{'file_path': 'Readme.txt', 'branch': 'master'}
以上是关于这是什么类型的JSON对象? (Gitlab API),(Python)的主要内容,如果未能解决你的问题,请参考以下文章