Json encode python django

Json encode python django

За отправку клиенту данных в формате JSON в Django отвечает специальный класс — JsonResponse , который по сути представляет подкласс HttpResponse. Основная особенность JsonResponse состоит в том, что при отправке данных он автоматически устанавливает для заголовка Content-Type (тип содержимого) значение application/json

Его конструктор принимает ряд параметров:

def __init__(data, encoder=DjangoJSONEncoder, safe=True, json_dumps_params=None, **kwargs)
  • data : отправляемые данные
  • encoder : сериализатор, которые сериализует отправляемые данные в формат JSON. По умолчанию представляет тип django.core.serializers.json.DjangoJSONEncoder
  • safe : представляет булевое значение. Если равно False , то сериализации подлежит любой объект. Если же равно True , то отправляемые данные должны представлять тип dict — то есть словарь. По умолчанию равно True
  • json_dumps_params : словарь аргументов, который передается в функцию json.dumps() для генерации ответа

Например, отправим какие-нибудь данные в формате JSON. Для этого определим в файле views.py следующий код:

from django.http import JsonResponse def index(request): return JsonResponse()

В данном случае отправляется словарь с двумя элементами name и age. И при обращении в браузере к функции index мы увидим эти данные:

Отправка json с помощью JsonResponse в веб-приложении на Django и python

Сериализация произвольных объектов

По умолчанию JsonResponse сериазует и отправляет только словари. Однако что, если мы хотим отправить объект какого-то своего типа? В этом случае неоьходимо определить класс-сериализатор, который будет содержать логику сериализации объекта в json. Например:

from django.http import JsonResponse from django.core.serializers.json import DjangoJSONEncoder def index(request): bob = Person("Bob", 41) return JsonResponse(bob, safe=False, encoder=PersonEncoder) class Person: def __init__(self, name, age): self.name = name # имя человека self.age = age # возраст человека class PersonEncoder(DjangoJSONEncoder): def default(self, obj): if isinstance(obj, Person): return # return obj.__dict__ return super().default(obj)

В данном случае JsonResponse отправляет объект типа Person, у которого определены два атрибута: name и age.

Читайте также:  Java regexp replace all

Объект Person не является словарем, поэтому параметр safe имеет значение False . Кроме того, параметр encoder указывает на сериализатор, который будет сериализовать данные в json. В данном случае это класс PersonEncoder.

Класс сериализатора наследуется от django.core.serializers.json.DjangoJSONEncoder . Он реализует метод default , который возвращает сериализованный объект. В частности, в этом методе сначала проверяем, представляет ли параметр объект Person. И если представляет, то возвращаем словарь из значений атрибутов объекта

Стоит отметить, что в данном случае мы можем просто возвратить представление объекта в виде словаря

Однако в отдельных ситуациях может потребоваться более тонкая настройка сериализации.

Если же объект не представляет тип Person, то передаем его в реализацию метода default родительского класса.

Результат при обращении в браузере:

Источник

JSON Encoding with Django adding extra \\ characters

I’m trying to create a function that will convert a dictionary containing a message and a Django model instance into JSON, that I can pass back to the client. For example, I have the model Test defined in models.py.

from django.db import models class Test(models.Model): test_field = models.CharField(max_length=40) 
from django.core.serializers import serialize from django.utils.simplejson import dumps, loads, JSONEncoder from django.db.models.query import QuerySet from django.db import models from django.utils.functional import curry class DjangoJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, QuerySet): # `default` must return a python serializable # structure, the easiest way is to load the JSON # string produced by `serialize` and return it return loads(serialize('json', obj)) if isinstance(obj, models.Model): #do the same as above by making it a queryset first set_obj = [obj] set_str = serialize('json', set_obj) #eliminate brackets in the beginning and the end str_obj = set_str[1:len(set_str)-2] return str_obj return JSONEncoder.default(self,obj) # partial function, we can now use dumps(my_dict) instead # of dumps(my_dict, cls=DjangoJSONEncoder) dumps = curry(dumps, cls=DjangoJSONEncoder) 
t = Test(test_field="hello") d = json = dumps(d) 

Which is basically what I want except for all the extra \\ characters. Why are these being inserted into the json? How can I modify my DjangoJSONEncoder so it doesn’t insert the \ characters? NOTE If I just encode the model instance manually I don’t get all the extra \\ characters.

s = serialize('json', [t]) s[1:len(s)-2] 

EDIT Based on the advice of Daniel Roseman and Leopd I modified the DjangoJSONEncoder class to the following:

class DjangoJSONEncoder(JSONEncoder): def default(self, obj): if isinstance(obj, QuerySet): # `default` must return a python serializable # structure, the easiest way is to load the JSON # string produced by `serialize` and return it return loads(serialize('python', obj)) if isinstance(obj, models.Model): #do the same as above by making it a list first return serialize('python', [obj])[0] return JSONEncoder.default(self,obj) 

Источник

Creating a JSON response using Django and Python

I’m trying to convert a server side Ajax response script into a Django HttpResponse, but apparently it’s not working. This is the server-side script:

/* RECEIVE VALUE */ $validateValue=$_POST['validateValue']; $validateId=$_POST['validateId']; $validateError=$_POST['validateError']; /* RETURN VALUE */ $arrayToJs = array(); $arrayToJs[0] = $validateId; $arrayToJs[1] = $validateError; if($validateValue =="Testuser")< // Validate?? $arrayToJs[2] = "true"; // RETURN TRUE echo ''; // RETURN ARRAY WITH success > else< for($x=0;$x<1000000;$x++)< if($x == 990000)< $arrayToJs[2] = "false"; echo ''; // RETURNS ARRAY WITH ERROR. > > > 
def validate_user(request): if request.method == 'POST': vld_value = request.POST.get('validateValue') vld_id = request.POST.get('validateId') vld_error = request.POST.get('validateError') array_to_js = [vld_id, vld_error, False] if vld_value == "TestUser": array_to_js[2] = True x = simplejson.dumps(array_to_js) return HttpResponse(x) else: array_to_js[2] = False x = simplejson.dumps(array_to_js) error = 'Error' return render_to_response('index.html',,context_instance=RequestContext(request)) return render_to_response('index.html',context_instance=RequestContext(request)) 

I’m using simplejson to encode the Python list (so it will return a JSON array). I couldn’t figure out the problem yet. But I think that I did something wrong about the ‘echo’.

Источник

Оцените статью