Jquery Javascript字符串化对象

Jquery Javascript字符串化对象,jquery,asp.net-mvc,json,asp.net-mvc-5,Jquery,Asp.net Mvc,Json,Asp.net Mvc 5,我正在使用MVC5和Select2插件的Ajax形式 该对象在Chrome控制台中的外观如下: 更容易将对象显示为图片 我想要的是提取ID和文本并将其保存到我的DB中。作为一个字符串化的对象。注意,还有很多其他解决方案只保存ID/值,然后对文本执行往返到DB的操作。 但我只想字符串化对象,只保存id和文本,然后在页面加载时将对象从隐藏字段序列化回Select2框 当我尝试使用JSON.stringify方法时,我得到一个错误: 未捕获InvalidStateError:未能从“HTMLInput

我正在使用MVC5和Select2插件的Ajax形式

该对象在Chrome控制台中的外观如下: 更容易将对象显示为图片

我想要的是提取ID和文本并将其保存到我的DB中。作为一个字符串化的对象。注意,还有很多其他解决方案只保存ID/值,然后对文本执行往返到DB的操作。 但我只想字符串化对象,只保存id和文本,然后在页面加载时将对象从隐藏字段序列化回Select2框

当我尝试使用JSON.stringify方法时,我得到一个错误:

未捕获InvalidStateError:未能从“HTMLInputElement”读取“selectionDirection”属性:输入元素的类型“hidden”不支持选择


由于您只想保存id和文本,因此可以从对象中删除其余字段,这也将删除数据库中的混乱:

var selectedObjects = $('#GeoList').select2('data');
var dataToSave = []
$.each(selectedObjects, function(index, obj) {
    dataToSave.push({ "id" : obj.id, "text" : obj.text});
});
var result = JSON.stringify(dataToSave);
对象中的元素字段似乎是一个HTML元素,其中包含许多您不需要的额外状态信息


我不确定这种情况发生的具体原因,但这里有一个类似的问题,说明了同样的事情:

因为您只想保存id和文本,所以可以从对象中删除其余字段,这也会删除数据库中的混乱:

var selectedObjects = $('#GeoList').select2('data');
var dataToSave = []
$.each(selectedObjects, function(index, obj) {
    dataToSave.push({ "id" : obj.id, "text" : obj.text});
});
var result = JSON.stringify(dataToSave);
对象中的元素字段似乎是一个HTML元素,其中包含许多您不需要的额外状态信息

我不清楚为什么会发生这种情况,但这里有一个类似的问题,它说明了同样的事情:

的ECMAScript规范指定了获取对象属性列表的行为,以便JSonified为:

设K为字符串的内部列表,由[[Enumerable]]属性为true的值的所有自身属性的名称组成。字符串的顺序应与Object.keys标准内置函数使用的顺序相同

因此,我们知道JSON.stringify尝试包含对象的所有可枚举属性,其中包括object.keys中命名的所有属性。对于除Firefox之外的DOM对象,它包括属性selectionDirection,当从读取时会引发错误。的ECMAScript规范指定获取对象属性列表的行为,以便JSONify为:

设K为字符串的内部列表,由[[Enumerable]]属性为true的值的所有自身属性的名称组成。字符串的顺序应与Object.keys标准内置函数使用的顺序相同


因此,我们知道JSON.stringify尝试包含对象的所有可枚举属性,其中包括object.keys中命名的所有属性。对于除Firefox之外的DOM对象,它包括属性selectionDirection,当从读取它时会抛出错误,因为它在另一个浏览器中工作,因此这可能是一个错误,您可以进一步报告它,以获得它所需的反馈

否则,您可以更进一步,通过使用从对象id/文本中提取的属性自己创建对象,然后将其字符串化,从而获得与浏览器兼容的广泛解决方案:

var geoList=$'geoList'。选择2'data'; var toStoreList=[]; $.eachgeoList,functionkey,val{ toStoreList.push{id:val.id,text:val.text}; };
然后调用数组对象上的JSON.stringify方法toStoreList。

因为它在另一个浏览器中工作,所以这可能是一个bug,您可以进一步报告它,以获得它需要的反馈

否则,您可以更进一步,通过使用从对象id/文本中提取的属性自己创建对象,然后将其字符串化,从而获得与浏览器兼容的广泛解决方案:

var geoList=$'geoList'。选择2'data'; var toStoreList=[]; $.eachgeoList,functionkey,val{ toStoreList.push{id:val.id,text:val.text}; };
然后调用数组对象上的JSON.stringify方法toStoreList。

不知道为什么会显示该错误。该字段不隐藏。如果我只是尝试运行以下命令,就会出现错误:JSON.stringify$'GeoList'。选择2'data';和$'GeoList'。选择2'data'可以从图片中看到对象。那么它是隐藏在物体中的东西吗你在不同的浏览器中试过吗?哈哈。是的,它在Aurora/Firefox:O中有效,但在Google Chrome v中无效。36.0也需要它来为Chrome工作:/尝试直接字符串化DOM元素不是一个好主意。从DOM元素中将所需的属性提取到更简单的JavaScript对象中,然后序列化这些对象。您正在输入。使用字符串选择2。我从未使用过那个插件,但从我在文档中看到的,它接受一个对象。我也不确定它会有什么回报。如果它创建了一个DOM节点,那么它可能返回“undefined”,而您无法将其字符串化。不知道它为什么会显示该错误。该字段不隐藏。如果我只是尝试运行此命令,则会出现错误
:JSON.stringify$'GeoList'。选择2'data';和$'GeoList'。选择2'data'可以从图片中看到对象。那么它是隐藏在物体中的东西吗你在不同的浏览器中试过吗?哈哈。是的,它在Aurora/Firefox:O中有效,但在Google Chrome v中无效。36.0也需要它来为Chrome工作:/尝试直接字符串化DOM元素不是一个好主意。从DOM元素中将所需的属性提取到更简单的JavaScript对象中,然后序列化这些对象。您正在输入。使用字符串选择2。我从未使用过那个插件,但从我在文档中看到的,它接受一个对象。我也不确定它会有什么回报。如果它创建了一个DOM节点,那么它可能返回“undefined”,而您不能将其字符串化。