JSON-сериализация объекта с параметром функции - PullRequest
13 голосов
/ 21 марта 2011

У меня есть этот объект C #:

var obj = new {
    username = "andrey",
    callback = "function(self) { return function() {self.doSomething()} (this) }"
}

Мне нужно JSON сериализовать его, чтобы передать браузеру в вызове ajax. Я использую JavascriptSerializer, но он сериализуется в следующем формате JSON:

{"username":"andrey", "callback": "function(self) { return function() {self.doSomething()} (this) }"}

но мне нужно:

{"username":"andrey", "callback": function(self) { return function() {self.doSomething()} (this) }}
  • без кавычек вокруг определения функции.

Прямо сейчас, когда объект JSON попадает в браузер и создается, параметр 'обратного вызова' является не функцией, а строкой. Любая идея, как это исправить, желательно на стороне сервера?

Ответы [ 2 ]

21 голосов
/ 29 мая 2013

Я пытался сделать что-то подобное. В моем случае я использовал синтаксис MVC Razor, пытаясь сгенерировать объект json с функцией, переданной с использованием синтаксиса @ .

Мне удалось получить желаемый результат, используя библиотеку Json.net (используя JsonConvert и JRaw).

Пример:

// set the property value using JRaw
var obj = new {
    username = "andrey",
    callback = new JRaw("function(self) { return function() {self.doSomething()} (this) }")
}
// and then serialize using the JsonConvert class
var jsonObj = JsonConvert.SerializeObject(obj);

Это должно дать вам объект json с функцией (вместо функции в строке).

Сообщение: Как сериализовать функцию в json (используя бритву @ )

7 голосов
/ 21 марта 2011

Такое поведение является преднамеренным. JSON не должен включать ничего, кроме данных - в вашем случае это исполняемая функция. Браузер будет подвергаться огромным угрозам безопасности, если данные могут возвращаться с сервера в формате JSON, который при запуске будет запускать произвольные функции (которые могут украсть информацию, перенаправить пользователя на вредоносный сайт и т. Д.)

Ранние реализации JSON основаны на том факте, что возвращаемые данные могут быть просто выполнены с помощью eval () для возврата объекта. Тем не менее, люди почти сразу поняли, что это создает огромные угрозы безопасности, и с тех пор пытаются справиться с этим. Вот почему до стандартизированного объекта JSON люди перестали помещать необработанные данные JSON в eval () и использовали вместо этого библиотеки синтаксического анализа JSON.

Объект JSON всегда сериализует объект только в данные. Это по замыслу. Стандартизированный формат JSON не может представлять исполняемую функцию.

Теперь вы можете легко преобразовать этот обратный вызов в браузере в функцию, передав его в eval (). Однако не делайте этого . Ты просто открываешь себя для взлома.

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

...