0

我正在通过 Kubernetes API 代理动词从 pod 的 Web 服务器请求一些 JSON 数据。那是:

corev1 = kubernetes.client.CoreV1Api()
res = corev1.connect_get_namespaced_pod_proxy_with_path(
    'mypod:5000', 'default', path='somepath', path2='somepath')
print(type(res))
print(res)

调用成功并返回一个str包含来自我的 pod 的 Web 服务的序列化 JSON 数据。不幸的是,res现在看起来像这样......这根本不是有效的 JSON,所以json.loads(res)拒绝解析它:

{'x': [{'xx': 'xxx', ...

如您所见,字符串化响应看起来像 Python 字典,而不是有效的 JSON。关于如何安全地转换回正确的 JSON 或正确的 Python 的任何建议dict

4

2 回答 2

2

在阅读了 Kubernetes Python 客户端的一些代码后,现在很清楚,connect_get_namespaced_pod_proxy()并且connect_get_namespaced_pod_proxy_with_path()强制将远程 API 调用的响应体str通过调用self.api_client.call_api(..., response_type='str', ...)( core_v1_api.py ) 转换为。所以,我们被 Kubernetes API 客户端困住了,它只给我们dict()代表原始 JSON 响应主体的字符串表示。

要将字符串转换回 a dict(),将字典的字符串表示形式转换为字典的答案?建议使用ast.literal_eval(). 想知道这是否是一条明智的选择路线,我找到了使用 python ast 库进行诸如将字符串转换为 dict 之类的操作的最佳实践的答案,说这是明智的做法。

import ast
corev1 = kubernetes.client.CoreV1Api()
res = corev1.connect_get_namespaced_pod_proxy_with_path(
    'mypod:5000', 'default', path='somepath', path2='somepath')
json_res = ast.literal_eval(res)
于 2019-04-25T17:32:55.303 回答
1

我在 pod 上执行时遇到了类似的问题并找到了解决方案。我想它也可以为你工作。

  1. 将参数 _preload_content=False, 添加到流调用 -> 您收到一个 WSClient 对象
  2. 调用 run_forever(timeout=10) 就可以了
  3. 然后你得到正确的和未格式化的字符串 .read_stdout()

例如:

wsclient_obj = stream(v1.connect_get_namespaced_pod_exec, m
                    y_name,
                    'default',
                    command=['/bin/sh', '-c', 'echo $MY_VAR'],
                    stderr=True,
                    stdin=False,
                    stdout=True,
                    tty=False,
                    _preload_content=False
                )
wsclient_obj.run_forever(timeout=10)
response_str = wsclient_obj.read_stdout()

之后json.loads(response_str)将工作:)

于 2020-07-24T09:55:56.733 回答