这是什么类型的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)的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI/CD 自动标记发布

无法确定类型“Class”的JSON对象类型

使用“多类型”属性序列化 Json 对象

单个 JSON 返回中的多个可编码对象类型

这是有效的 JSON 吗?电子邮件地址作为参考类型?

JSONObject.toBean怎么转化带有Timestamp类型的对象