Huy Tower
Huy Tower

Reputation: 7976

TypeError: expected string or buffer in Google App Engine's Python

I want to show the content of an object using the following code:

def get(self):
    url="https://www.googleapis.com/language/translate/v2?key=MY-BILLING-KEY&q=hello&source=en&target=ja"
    data = urllib2.urlopen(url)
    parse_data = json.load(data)
    parsed_data = parse_data['data']['translations']

    // This command is ok
    self.response.out.write("<br>")

    // This command shows above error
    self.response.out.write(str(json.loads(parsed_data[u'data'][u'translations'][u'translatedText'])))

But the error

TypeError: expected string or buffer

appears as a result of the line:

self.response.out.write(str(json.loads(parsed_data[u'data'][u'translations'][u'translatedText'])))

or

self.response.out.write(json.loads(parsed_data[u'data'][u'translations'][u'translatedText']))

UPDATE (fix):

I needed to convert from string to JSON object:

    # Convert to String
    parsed_data = json.dumps(parsed_data)

    # Convert to JSON Object
    json_object = json.loads(parsed_data)

    # Parse JSON Object
    translatedObject = json_object[0]['translatedText']

    # Output to page, by using HTML
    self.response.out.write(translatedObject)

Upvotes: 6

Views: 10677

Answers (3)

guichao
guichao

Reputation: 198

The urllib2.urlopen function return a file-like object, not a string. You should read the response first.

url = "http://www.example.com/data"
f = urllib2.urlopen(url)
data = f.read()
print json.loads(data)

Upvotes: 0

Huy Tower
Huy Tower

Reputation: 7976

All I need, is convert from String to JSON object, as the following code :

# Convert to String
parsed_data = json.dumps(parsed_data)

# Convert to JSON Object
json_object = json.loads(parsed_data)

# Parse JSON Object
translatedObject = json_object[0]['translatedText']

# Output to page, by using HTML
self.response.out.write(translatedObject)

Upvotes: 0

Felipe Hoffa
Felipe Hoffa

Reputation: 59175

parse_data = json.load(data)
parsed_data = parse_data['data']['translations']

Those lines already did the json.load, and extracted 'data' and 'translations'. Then instead of:

self.response.out.write(str(
    json.loads(parsed_data)[u'data'][u'translations'][u'translatedText']))

you should:

self.response.out.write(str(
    parsed_data[u'translatedText']))

Upvotes: 2

Related Questions