Как сериализовать javascript-объект в json-файл, который включает все методы класса? [Дубликат]

Если вам не нужны тесты в выпуске вашего проекта (которые вы хотите поставить с помощью CPack), тогда условно укажите подкаталог googletest и установите для параметра false значение false при упаковке:

...
if(NOT DISABLE_TESTS)
    add_subdirectory(googletest)
endif()

упаковка с

cmake -DDISABLE_TESTS=ON 
cpack

Альтернативно, если вы хотите тесты, но не хотите устанавливать инфраструктуру тестирования, вы можете отключить команду install посредством определения макроса или функции с тем же именем:

# Replace install() to do-nothing macro.
macro(install)
endmacro()
# Include subproject (or any other CMake code) with "disabled" install().
add_subdirectory(googletest)
# Restore original install() behavior.
macro(install)
    _install(${ARGN})
endmacro()

Этот подход также был предложен в рассылке CMake .

1
задан Henrik Hansen 12 March 2012 в 16:00
поделиться

5 ответов

Функции не могут быть сериализованы в объект JSON.

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

Следуя вашему примеру, это может выглядеть так:

function MyObject() { this.init(); }
MyObject.prototype = {
    data: {
      property1: "",
      property2: ""
    },

    init: function () {
        this.property1 = "First";
        this.property2 = "Second";
    },

    test: function() {
      alert("Executing test!");
    },


   save: function( id ) {
     window.localStorage.setItem( id, JSON.stringify(this.data));
   },
   load: function( id ) {
     this.data = JSON.parse( window.getItem( id ) );
   }

}
3
ответ дан Sirko 20 August 2018 в 11:18
поделиться
  • 1
    Вау. Это так элегантно. Я люблю это. Большое спасибо, что поделились. – user208662 12 March 2012 в 16:08
  • 2
    Свойства, хранящиеся на прототипе, не могут быть сериализованы в объект JSON ... – Alnitak 13 March 2012 в 12:44

JSON не сериализует функции.

Взгляните на второй абзац здесь .

Если вам нужно сохранить такие значения , вы можете преобразовывать значения по мере их сериализации или до десериализации, чтобы JSON мог представлять дополнительные типы данных.

Другими словами, если вы действительно хотите JSONify функции, вы можете преобразуйте их в строки перед сериализацией:

mo.init = ''+mo.init;
mo.test = ''+mo.test;

И после десериализации, преобразуйте их обратно в функции.

mo.init = eval(mo.init);
mo.test = eval(mo.test);

Однако для этого не должно быть никаких оснований. Вместо этого вы можете иметь конструктор MyObject принять простой объект (как результат синтаксического анализа строки JSON) и скопировать свойства объекта самому себе.

5
ответ дан Dagg Nabbit 20 August 2018 в 11:18
поделиться
  • 1
    Есть ли шанс, что вы можете привести пример этого? возможно, JSFiddle? ТИА – Flak DiNenno 23 October 2014 в 17:12

Вы правы, функции отбрасываются. Эта страница может помочь:

http://www.json.org/js.html

"Значения, которые не имеют представления в JSON ( такие как функции и неопределенные) исключаются ».

0
ответ дан JTeagle 20 August 2018 в 11:18
поделиться

Это потому, что JSON.stringify() не сериализует функции, которые я думаю.

0
ответ дан Nicola Peluchetti 20 August 2018 в 11:18
поделиться

Чтобы избежать изменения структуры, я предпочитаю использовать метод Object.assign для извлечения объекта. Этот метод объединяет второй объект параметра в первом. Чтобы получить объектные методы, нам просто нужен пустой новый объект, который используется в качестве целевого параметра.

var mo = window.localStorage.getItem("myObject");
// this object has properties only
mo = JSON.parse(mo);
// this object will have properties and functions
var completeObject = Object.assign(new MyObject(), mo);

Обратите внимание, что первый параметр Object.assign изменен и возвращен функцией.

1
ответ дан Nicolas Janel 20 August 2018 в 11:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: