TypeError: объект типа «Местоположение» не сериализуем JSON

я использую библиотеку geopy для своего веб-приложения Flask. я хочу сохранить местоположение пользователя, которое я получаю из моей модальной (html-формы) в своей базе данных (я использую mongodb), но каждый раз, когда я получаю эту ошибку: TypeError: объект типа «Местоположение» не сериализуемый JSON

Вот код:

@app.route('/register', methods=['GET', 'POST'])
def register_user():
    if request.method == 'POST':
        login_user = mongo.db.mylogin
        existing_user = login_user.find_one({'email': request.form['email']})
        # final_location = geolocator.geocode(session['address'].encode('utf-8'))
        if existing_user is None:
            hashpass = bcrypt.hashpw(
                request.form['pass'].encode('utf-8'), bcrypt.gensalt())
            login_user.insert({'name': request.form['username'], 'email': request.form['email'], 'password': hashpass, 'address': request.form['add'], 'location' : session['location'] })
            session['password'] = request.form['pass']
            session['username'] = request.form['username']
            session['address'] = request.form['add']
            session['location'] = geolocator.geocode(session['address'])
            flash(f"You are Registerd as {session['username']}")
            return redirect(url_for('home'))
        flash('Username is taken !')
        return redirect(url_for('home'))
    return render_template('index.html')

Пожалуйста, помогите, дайте мне знать, если вам нужна дополнительная информация..


person vatsalay    schedule 20.12.2019    source источник


Ответы (2)


Согласно документации геолокатора функция геокод "Вернуть местоположение указать по адресу" geopy.location.Location объект.

Сериализация Json по умолчанию поддерживает следующие типы:

Питон | JSON

дикт | объект

список, кортеж | множество

ул, юникод | нить

целое, длинное, с плавающей запятой | количество

Правда | истинный

Ложь | ЛОЖЬ

Нет | нулевой

Все остальные объекты/типы не сериализуются json по умолчанию, и вам нужно это определить.

geopy.location.Location.raw

Необработанный, необработанный ответ геокодера местоположения. Для получения подробной информации об этом обратитесь к документации службы.

Тип возвращаемого значения: dict или None

Возможно, вы сможете вызвать необработанную функцию Location (возвращаемое значение geolocator.geocode), и это значение будет сериализуемо в json.

person Amiram    schedule 22.12.2019

Location действительно не сериализуем json: в этом объект, и нет единого способа представить местоположение, поэтому вам придется выбирать один из них самостоятельно.

Какой тип значения вы ожидаете увидеть в ключе location ответа?

Вот некоторые примеры:

Текстовый адрес

In [9]: json.dumps({'location': geolocator.geocode("175 5th Avenue NYC").address})
Out[9]: '{"location": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America"}'

Координаты точки

In [10]: json.dumps({'location': list(geolocator.geocode("175 5th Avenue NYC").point)})
Out[10]: '{"location": [40.7410861, -73.9896298241625, 0.0]}'

Необработанный ответ Nominatim

(Вероятно, это не то, что вы хотите показывать в своем API, предполагая, что вы хотите сохранить возможность изменить службу геокодирования на другую в будущем, которая может иметь другую схему ответа raw).

In [11]: json.dumps({'location': geolocator.geocode("175 5th Avenue NYC").raw})
Out[11]: '{"location": {"place_id": 138642704, "licence": "Data \\u00a9 OpenStreetMap contributors, ODbL 1.0. https://osm.org/copyright", "osm_type": "way", "osm_id": 264768896, "boundingbox": ["40.7407597", "40.7413004", "-73.9898715", "-73.9895014"], "lat": "40.7410861", "lon": "-73.9896298241625", "display_name": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America", "class": "tourism", "type": "attraction", "importance": 0.74059885426854, "icon": "https://nominatim.openstreetmap.org/images/mapicons/poi_point_of_interest.p.20.png"}}'

Текстовый адрес + координаты точки

In [12]: location = geolocator.geocode("175 5th Avenue NYC")
    ...: json.dumps({'location': {
    ...:     'address': location.address,
    ...:     'point': list(location.point),
    ...: }})
Out[12]: '{"location": {"address": "Flatiron Building, 175, 5th Avenue, Flatiron District, Manhattan Community Board 5, Manhattan, New York County, New York, 10010, United States of America", "point": [40.7410861, -73.9896298241625, 0.0]}}'
person KostyaEsmukov    schedule 23.12.2019