简体   繁体   English

我如何JSON从谷歌的自然语言API序列化对象? (没有__dict__属性)

[英]How can I JSON serialize an object from google's natural language API? (No __dict__ attribute)

I'm using the Google Natural Language API for a project tagging text with sentiment analysis. 我正在使用Google Natural Language API为带有情绪分析的项目标记文本。 I want to store my NL results as JSON. 我想将我的NL结果存储为JSON。 If a direct HTTP request is made to Google then a JSON response is returned. 如果向Google发出直接HTTP请求,则会返回JSON响应。

However when using the provided Python libraries an object is returned instead, and that object is not directly JSON serializable. 但是,当使用提供的Python库时,将返回一个对象,并且该对象不是直接JSON可序列化的。

Here is a sample of my code: 以下是我的代码示例:

import os
import sys
import oauth2client.client
from google.cloud.gapic.language.v1beta2 import enums, language_service_client
from google.cloud.proto.language.v1beta2 import language_service_pb2

class LanguageReader:
    # class that parses, stores and reports language data from text

    def __init__(self, content=None):

        try:
            # attempts to autheticate credentials from env variable
            oauth2client.client.GoogleCredentials.get_application_default()
        except oauth2client.client.ApplicationDefaultCredentialsError:
            print("=== ERROR: Google credentials could not be authenticated! ===")
            print("Current enviroment variable for this process is: {}".format(os.environ['GOOGLE_APPLICATION_CREDENTIALS']))
            print("Run:")
            print("   $ export GOOGLE_APPLICATION_CREDENTIALS=/YOUR_PATH_HERE/YOUR_JSON_KEY_HERE.json")
            print("to set the authentication credentials manually")
            sys.exit()

        self.language_client = language_service_client.LanguageServiceClient()
        self.document = language_service_pb2.Document()
        self.document.type = enums.Document.Type.PLAIN_TEXT
        self.encoding = enums.EncodingType.UTF32

        self.results = None

        if content is not None:
                self.read_content(content)

    def read_content(self, content):
        self.document.content = content
        self.language_client.analyze_sentiment(self.document, self.encoding)
        self.results = self.language_client.analyze_sentiment(self.document, self.encoding)

Now if you were to run: 现在,如果你要跑:

sample_text="I love R&B music. Marvin Gaye is the best. 'What's Going On' is one of my favorite songs. It was so sad when Marvin Gaye died."
resp = LanguageReader(sample_text).results
print resp

You would get: 你会得到:

document_sentiment {
  magnitude: 2.40000009537
  score: 0.40000000596
}
language: "en"
sentences {
  text {
    content: "I love R&B music."
  }
  sentiment {
    magnitude: 0.800000011921
    score: 0.800000011921
  }
}
sentences {
  text {
    content: "Marvin Gaye is the best."
    begin_offset: 18
  }
  sentiment {
    magnitude: 0.800000011921
    score: 0.800000011921
  }
}
sentences {
  text {
    content: "\'What\'s Going On\' is one of my favorite songs."
    begin_offset: 43
  }
  sentiment {
    magnitude: 0.40000000596
    score: 0.40000000596
  }
}
sentences {
  text {
    content: "It was so sad when Marvin Gaye died."
    begin_offset: 90
  }
  sentiment {
    magnitude: 0.20000000298
    score: -0.20000000298
  }
}

Which is not JSON. 哪个不是JSON。 It's an instance of the google.cloud.proto.language.v1beta2.language_service_pb2.AnalyzeSentimentResponse object. 它是google.cloud.proto.language.v1beta2.language_service_pb2.AnalyzeSentimentResponse对象的一个​​实例。 And it has no __dict__ attribute attribute so it is not serializable by using json.dumps(). 并且它没有__dict__属性属性,因此使用json.dumps()无法序列化。

How can I either specify that the response should be in JSON or serialize the object to JSON? 如何指定响应应该是JSON还是将对象序列化为JSON?

Edit: @Zach noted Google's protobuf Data Interchange Format . 编辑:@Zach注意到谷歌的protobuf 数据交换格式 It seems the preferred option would be to use these protobuf.json_format methods: 似乎首选的选择是使用这些protobuf.json_format方法:

from google.protobuf.json_format import MessageToDict, MessageToJson 

self.dict = MessageToDict(self.results)
self.json = MessageToJson(self.results)

From the docstring: 从文档字符串:

MessageToJson(message, including_default_value_fields=False, preserving_proto_field_name=False)
    Converts protobuf message to JSON format.

    Args:
      message: The protocol buffers message instance to serialize.
      including_default_value_fields: If True, singular primitive fields,
          repeated fields, and map fields will always be serialized.  If
          False, only serialize non-empty fields.  Singular message fields
          and oneof fields are not affected by this option.
      preserving_proto_field_name: If True, use the original proto field
          names as defined in the .proto file. If False, convert the field
          names to lowerCamelCase.

    Returns:
      A string containing the JSON formatted protocol buffer message.

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何JSON序列化Django模型的__dict__? - How to JSON serialize __dict__ of a Django model? 如何自动提取嵌套的 json,其中很少有 json 对象嵌套 json 对象,但可以用 __dict__ 解析 - How to auto extracting nested json in which few json object nested json object but can be parsed with __dict__ 我可以访问本地范围的__dict__对象吗? - Can I access the __dict__ object for the local scope? 对象在python3中没有属性'.__ dict__' - Object has no attribute '.__dict__' in python3 AttributeError:“ str”对象没有属性“ __dict__” - AttributeError: 'str' object has no attribute '__dict__' 'str'对象没有属性'__dict__' - 'str' object has no attribute '__dict__' AttributeError:“字节”对象没有属性“ __dict__” - AttributeError: 'bytes' object has no attribute '__dict__' object 的 __dict__ 不显示 @property 属性 - __dict__ for an object not showing @property attribute 如何获取没有__dict__的Python对象的属性列表? - How can I get a list of attributes of a Python object which doen't have __dict__? 如何将谷歌云自然语言实体情感响应转换为 Python 中的 JSON/dict? - how to convert google cloud natural language entity sentiment response to JSON/dict in Python?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM