【发布时间】:2020-10-22 04:13:44
【问题描述】:
我有一个从用户那里收集一长串输入的剃须刀表单。我需要将数据存储在 SQL Server 中。但我不想在 SQL Server 表中创建那么多列。所以我的想法是有一个nvarchar(max) 类型的列FormData,将FormCollection 对象转换为Json 并将其存储在table.FormData 中。
[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Create(IFormCollection collection)
{
try
{
string json = JsonConvert.SerializeObject(collection);
MyObject form = new MyObject()
{
id = 1,
formdata = json
};
repository.Add(form);
return RedirectToAction(nameof(Index));
}
catch
{
return View();
}
}
存储数据工作正常,但是当我检索它时,反序列化失败。
我编写了一个 API 来检索它。返回数据包含转义字符,我认为这就是导致问题的原因。
表单数据:
[
{
"id": 1,
"formdata": "[{\"Key\":\"Name\",\"Value\":[\"Person1\"]},{\"Key\":\"EmpID\",\"Value\":[\"12345\"]},{\"Key\":\"inputDepartment\",\"Value\":[\"\"]},{\"Key\":\"inputLocation\",\"Value\":[\"\"]},{\"Key\":\"inputSupervisor\",\"Value\":[\"\"]},{\"Key\":\"inputExitDate\",\"Value\":[\"\"]},{\"Key\":\"optShouldEmailBeActive\",\"Value\":[\"on\"]},{\"Key\":\"optWhoHasAccess\",\"Value\":[\"on\"]},{\"Key\":\"__RequestVerificationToken\",\"Value\":[\"CfDJ8M9krkWO1eBMp3rh5qzs-Rv1bj07MLUgOrWTcXV-ivrIiXkHW30I0e0NYWuBtbvyjONlULoENzivw1NXfITYL1Y8CVIOoDgFW_ACPu9XLhHe8x5KUcOZ-FuLeXyR-Vj0Q7RE_lSmnDchZsB6ihVyW4bnFcKAjo9X62rknPNUHvvEjsIN7-1EHtrgMT2-TgLPkQ\"]}]",
}
]
我找不到在序列化时避免使用这些转义字符的方法。
我想在存储之前使用.replace() 删除这些转义字符,但我不确定这是否是个好主意。如果找不到更好的解决方案,我可能最终会这样做。
=============================
反序列化代码:
只是为了测试,我在序列化后立即尝试反序列化,但失败了。
JSON.stringify(data)的Ajax调用结果:
Javascript 代码:
尝试删除转义字符。
function getData() {
var url = baseURL + "api/itexit";
$.ajax({
url: url,
type: "GET",
success: function (data) {
var json = JSON.stringify(data);
json = json.replace(/\\"/g, '"');
alert(json);
var obj = JSON.parse(json);
var a = "";
$.each(obj, function (index) {
a += obj[index].Key + "\n";
});
alert(a);
},
error: function (data) {
}
});
}
Chrome 开发者控制台出错:
这个错误在 JSON.parse(json);
==============================================
更新:
修复javascript代码后,它可以工作了:
function getData() {
var url = baseURL + "api/itexit";
$.ajax({
url: url,
type: "GET",
success: function (data) {
var json = JSON.stringify(data);
json = json.replace(/\\"/g, '"');
json = json.replace('\"[', '[');
json = json.replace(']\"', ']');
var obj = JSON.parse(json);
obj = obj[0].formdata;
$.each(obj, function (index) {
var o = obj[index];
$("#" + o.Key).val(o.Value);
});
},
error: function (data) {
}
});
}
【问题讨论】:
-
反序列化时遇到什么问题?可以分享一下反序列化的代码吗?
-
我用屏幕截图更新了我的帖子,以显示反序列化代码和错误消息。
-
我修复了我的 JavaScript 代码,它现在可以工作了。
-
反序列化代码仍然不起作用。但现在对我来说并不重要。我在 ajax 调用中获取 JSON 数据,并且能够解析它。
标签: c# json sql-server asp.net-core razor