这是什么类型的JSON对象? (Gitlab API),(Python)

时间:2017-07-09 23:46:44

标签: python json gitlab

我使用GitLab的File Repository 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响应。

这是什么?

3 个答案:

答案 0 :(得分:4)

这似乎是Gitlab中的一个漏洞。请参阅https://gitlab.com/gitlab-org/gitlab-ee/issues/2298

  

当前的错误行为是什么?

     

响应:

{:file_path=>"Readme.txt", :branch=>"master"}
     

预期的正确行为是什么?

     

响应:

{"file_name": "Readme.txt", "branch": "master"}

答案 1 :(得分:1)

问题仍然在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;
    }

答案 2 :(得分:0)

为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'}