2016-04-15 7 views
2

Ich versuche, diesen Parameter auf urlencode:Wie urllib.urlencode ein Wörterbuch innerhalb eines Arrays?

params = { 
           "attachments": [ 
            { 
             "title": "output.title", 
             "text": "output.text", 
            } 
           ]} 

urllib.urlencode(params, True) 

Dies ist, was ich bekommen:

attachments=%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D 

Das ist das, was ich erwarte:

attachments=%5B%7B%22text%22%3A%20%22output.text%22%2C%20%22title%22%3A%22output.title%22%7D%5D 

UPDATE:

Ich habe festgestellt, wenn ich Dosis deaktivieren, bekomme ich etwas näher zu dem, was ich brauche.

urllib.urlencode(params) 

attachments=%5B%7B%27text%27%3A+%27output.text%27%2C+%27title%27%3A+%27output.title%27%7D%5D 

Aber es gibt immer noch Unterschiede% 22% vs% 27%

+0

Ein Wörterbuch hat keine Reihenfolge. –

+0

Reihenfolge spielt keine Rolle. Die Codierung sieht für mich nicht gleich aus. – Houman

+0

Könnten Sie bitte Ihren Code entfernen, um das Problem zu demonstrieren? –

Antwort

1

Nun %22 ist das doppelte Anführungszeichen ("), während %27 ist das einfache Anführungszeichen ('). Und urllib.urlencode einfach ein Wörterbuch oder eine Sequenz von zwei Elementen Tupel codieren.

Also hier Ihr Wörterbuch hat attachement als Schlüssel, und die folgende Liste der Wörterbücher als Wert:

    val = [ 
           { 
            "title": "output.title", 
            "text": "output.text", 
           } 
          ] 

Aber für Python, diese Liste ist nicht ein String, so dass er verwendet, um seine Darstellung als string (mit einfachen Anführungszeichen):

>>> str(val) 
[{'text': 'output.text', 'title': 'output.title'}] 

und dann urlencode diese Zeichenfolge. Wenn Sie doppelte Anführungszeichen wollen Json kompatibel sein, sollten Sie das json-Modul verwenden:

>>> json.dumps(val) 
'[{"text": "output.text", "title": "output.title"}]' 

Schließlich würde es geben:

>>> urllib.urlencode({ k: json.dumps(v) for k,v in params.iteritems() }) 
'attachments=%5B%7B%22text%22%3A+%22output.text%22%2C+%22title%22%3A+%22output.title%22%7D%5D' 

das ist, was Sie erwartet haben (abgesehen von der Reihenfolge der Elemente, aber ein Wörterbuch ist ein Hash und verwaltet keine Reihenfolge - verwenden Sie eine Sequenz von Paaren, wenn Sie eine Bestellung benötigen)

0

Python Wörterbuchtyp wie folgt dargestellt,

>>> params = { 
...        "attachments": [ 
...         { 
...          "title": "output.title", 
...          "text": "output.text", 
...         } 
...        ]} 
>>> print params 
{'attachments': [{'text': 'output.text', 'title': 'output.title'}]} 

urllib.urlencode, dass Strings zu entkommen. also hast du "% 27", was html-escape-character von single quotation ist.

Aber Sie möchten zu "% 22" (Doppelzitat) entkommen.

Wenn Sie es wollen, dann müssen Sie urlencode nicht direkt verwenden.

Versuchen Sie, JSON-Dumps zu verwenden und jedes Element zu codieren.

Wie,

import urllib 
import json 


def myencode(dic): 
    return urllib.urlencode({d: json.dumps(dic[d]) for d in dic}) 

params = { 
           "attachments": [ 
            { 
             "title": "output.title", 
             "text": "output.text", 
            } 
           ]} 

urllib.urlencode(params, True) 

myencode(params)