Cum pot configura codarea Pyramid JSON?

Încerc să readuc o funcție ca aceasta:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

Datorită codării JSON a proprietății Pyramid, acesta iese dublu codat astfel:

"{\"color\": \"color\", \"message\": \"message\"}"

Cum pot remedia asta? Trebuie să folosesc argumentul implicit (sau echivalent), deoarece este necesar pentru tipurile personalizate ale lui Mongo.

0
Oricine știe cum pot să scape sau să nu mai cript acest lucru?
adăugat autor zakdances, sursa
Cum pot să nu-l cript?
adăugat autor zakdances, sursa
De ce nu fac eroarea dacă trec în JSON drept (fără JSON.dumps)?
adăugat autor zakdances, sursa
Aceasta nu este o formare ciudată. Acesta este un format normal forțat JSON, care utilizează citate escapate.
adăugat autor VisioN, sursa
@VisioN: Este este formatarea JSON normală ... pentru un șir .
adăugat autor Ignacio Vazquez-Abrams, sursa
Nu treceți parametrii color și message în dicționarul dvs. json.
adăugat autor Joel Cornett, sursa

4 răspunsuri

Nu ați spus, dar voi presupune că folosiți doar modulul standard json .

Modulul json nu definește o clasă pentru JSON; utilizează un standard Python dict ca reprezentare "nativă" a datelor dvs. json.dumps() codifică un dict ca un șir JSON; json.loads() ia un șir JSON și dă înapoi un dict .

Deci, în loc de a face acest lucru:

def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

Încercați să faceți acest lucru:

def returnJSON(color, message=None):
    return { "color" : "color", "message" : "message" }

Doar trimiteți un simplu dict . Vedeți cum vă place această aplicație pentru iPhone.

0
adăugat

În plus față de alte răspunsuri excelente, aș dori să subliniez că dacă nu doriți ca datele returnate de funcția de vizualizare să fie transmise prin json.dumps, atunci nu ar trebui să utilizați renderer = "json" în configurația de vizualizare: )

Deci, în loc de

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

puteți folosi doar

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='string')
def returnJSON(color, message=None):
    return  json.dumps({ "color" : "color", "message" : "message" }, default=json_util.default)

string renderer will just pass the string data returned by your function as-is. However, registering a custom renderer is a nicer approach (see @orip's answer)

0
adăugat
Ar fi trebuit să fiu mai specific ... Adică funcția JSON() pentru crearea paramelor de redare a fost adăugată doar în 1.4
adăugat autor zakdances, sursa
Acest lucru este adevărat și este soluția pe care o folosesc acum. Va trebui să aștept până când Pyramid 1.4 va fi lansat pentru a utiliza un renderer personalizat.
adăugat autor zakdances, sursa
Cred că ați citit greșit documentația - înregistrarea redării personalizate a fost disponibilă în Pyramid pentru o lungă perioadă de timp, folosesc un renderer personalizat într-o aplicație de când Pyramida a fost numită repoze.bfg. pyramid.readthedocs.org/ro/latest/ Narr/& hellip;
adăugat autor Sergey, sursa

Se pare că dicționarul este JSON codat de două ori, echivalentul a:

json.dumps(json.dumps({ "color" : "color", "message" : "message" }))

Poate că framework-ul dvs. Python JSON-codifică automat rezultatul? Încercați în schimb:

def returnJSON(color, message=None):
  return { "color" : "color", "message" : "message" }

EDIT:

Pentru a utiliza un renderer Pyramid personalizat care generează JSON așa cum doriți, încercați acest lucru (pe baza docererele renderer și sursele de redare ).

La pornire:

from pyramid.config import Configurator
from pyramid.renderers import JSON

config = Configurator()
config.add_renderer('json_with_custom_default', JSON(default=json_util.default))

Apoi aveți un "json_with_custom_default" renderer de utilizat:

@view_config(route_name='CreateNewAccount', request_method='GET', renderer='json_with_custom_default')

EDIT 2

O altă opțiune ar putea fi returnarea unui obiect Response pe care editorul să nu îl modifice. De exemplu.

from pyramid.response import Response
def returnJSON(color, message):
  json_string = json.dumps({"color": color, "message": message}, default=json_util.default)
  return Response(json_string)
0
adăugat
Cred că problema este că această caracteristică este pentru Pyramid 1.4 și sunt pe sursa 1.3: readthedocs.org/docs/pyramid/en/master/api/renderers.html
adăugat autor zakdances, sursa
implicit = json_util.default trebuie să fie înfășurat în JSON ()?
adăugat autor zakdances, sursa
Obțineți o eroare "Global named JSON not defined" de la linia config.add_renderer
adăugat autor zakdances, sursa
Wow orip ... acest lucru este serios impresionant. Folosesti si Pyramidul? De asemenea, ați fost primii care ghicesc corect rădăcina problemei mele (codificare dublă) Foarte impresionantă
adăugat autor zakdances, sursa
Folosesc Pyramid. Este setat cu un renderer: @view_config (route_name = 'CreateNewAccount', request_method = 'GET', renderer = 'json')
adăugat autor zakdances, sursa
Asta funcționează, așa cum am menționat în post. Trebuie să folosesc JSON.dumps, deși am nevoie de default = json_util.default pentru a serializa obiecte Mongo.
adăugat autor zakdances, sursa
Cred că JSON ar trebui să fie json.JSONEncoder .
adăugat autor Matthew Flaschen, sursa
Ce cadru web Python folosiți? Trebuie să dezactivați codarea automată JSON sau să găsiți o modalitate de a modifica modul în care cadrul face codificarea JSON.
adăugat autor orip, sursa
Adăugați cod exemplu și linkuri pentru redare personalizată Pyramid, poate că acest lucru vă va ajuta
adăugat autor orip, sursa
Mulțumesc și nu, nu folosesc Pyramid, dar toate cadrele web în toate limbile au aceleași probleme :)
adăugat autor orip, sursa
(1) Ar putea fi faptul că aveți nevoie de din importul pyramid.renderers JSON . (2) clasa JSON transmite funcțiile json.dumps argumentele cuvintelor cheie date în constructorul lor (a se vedea sursa pe care am legat-o) JSON cu default = json_util.default ar trebui să utilizeze opțiunile corecte. (3) Dacă aceasta nu funcționează, încercați să codificați în JSON ca și cum ați început, dar să o împachetați într-un Response pentru a împiedica modificarea oricăror radiodifuzori. Este posibil să fiți nevoit să setați s
adăugat autor orip, sursa

You are dumping the string of the Python object (dictionary) you are giving it.

The manual for json.dumps states:

Serializați obj pe o pagină formatată JSON

Pentru a converti din șir, trebuie să utilizați funcția Încărcarea funcției Python JSON care LOADS un șir într-un obiect JSON.

Ceea ce se pare că încercați să faceți este codul encode , un dicționar python în JSON.

def returnJSON(color, message=None):
    return  json.encode({ "color" : color, "message" : message })
0
adăugat
@MatthewFlaschen este corect ... acum am nevoie să dau seama cum pot dezactiva asta
adăugat autor zakdances, sursa
Sunt de acord. Este probabil cauzată de această linie: @view_config (route_name = 'CreateNewAccount', request_method = 'GET', renderer = 'json')
adăugat autor zakdances, sursa
pot folosi json.encode cu default = json_util.default?
adăugat autor zakdances, sursa
Problema nu este depozitele inițiale. Problema este că este codificată din nou în jos.
adăugat autor Matthew Flaschen, sursa
@yourfriendzak, aceasta este acum o intrebare Pyramid si pymongo, asa ca ar trebui sa o editati corespunzator. Ți-am dat un start.
adăugat autor Matthew Flaschen, sursa
JavaScript, România - Moldova
JavaScript, România - Moldova
328 participanți

Comunitatea Română JavaScript: github.com/js-ro Pentru confort, opriți notificările. Parteneri: @node_ro, @php_ro, @python_ro, @seo_ro, @RomaniaGroup, @ai_ro, @Grupuri_IT Offtop: @holywars_ro Joburi: @js_jobs_ro Sponsored with ❤️ by ciupacabra.com

Python România
Python România
100 participanți

Comunitatea pasionaților de Python din România.