尝试将Google Vision响应转换为Python字典时出现属性错误

bjg7j2ky  于 2023-11-16  发布在  Python
关注(0)|答案(4)|浏览(93)

我在Windows上使用Python 3.8.6rc1protobuf version 3.13.0google-cloud-vision version 2.0.0
我的代码是:

from google.protobuf.json_format import MessageToDict
from google.cloud import vision
    
client = vision.ImageAnnotatorClient()
response = client.annotate_image({
            'image': {'source': {'image_uri': 'https://images.unsplash.com/photo-1508138221679-760a23a2285b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60'}},
        })
MessageToDict(response)

字符串
它在MessageToDict(response)失败,我有一个attribute error: "DESCRIPTOR"。似乎response不是一个有效的protobuf对象。有人能帮助我吗?谢谢

xwmevbvl

xwmevbvl1#

这并没有真正回答我的问题,但我发现解决这个问题并访问protobuf对象的一种方法是使用response._pb,因此代码变为:

response = client.annotate_image({
            'image': {'source': {'image_uri': 'https://images.unsplash.com/photo-1508138221679-760a23a2285b?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=800&q=60'}},
        })
MessageToDict(response._pb)

字符串

yquaqz18

yquaqz182#

听着第三步,

第一步:导入此库

from google.protobuf.json_format import MessageToDict

字符串

第二步:发送请求

keyword_ideas = keyword_plan_idea_service.generate_keyword_ideas(
    request=request
)

第三步:将响应转换为json [看这里,添加“.pd”]

keyword_ideas_json = MessageToDict(keyword_ideas._pb) // add ._pb at the end of object

第四步:对json做任何你想做的事情

print(keyword_ideas_json)

  • Github上同一个问题:here*
puruo6ea

puruo6ea3#

可以看看this post

json_string = type(response).to_json(response)
# Alternatively
import proto
json_string = proto.Message.to_json(response)

字符串

ruarlubt

ruarlubt4#

从github issue @FriedrichSal发布的文章中,你可以看到proto完成了这项工作,并且在2022年仍然有效(库名为proto-plus):
所有的消息类型现在都使用proto-plus定义,它使用不同的方法进行序列化和非序列化。

import proto
objects = client.object_localization(image=image)
json_objs = proto.Message.to_json(objects)
dict_objs = proto.Message.to_dict(objects)

字符串
MessageToJson(objects._pb)仍然可以工作,但可能有些人不喜欢依赖于“隐藏”属性。

相关问题