【发布时间】:2016-12-08 23:01:26
【问题描述】:
很久以前,我为我的应用设置了一个编码标准,所有返回 JSON 的操作都将其结果放入顶级包装器对象中:
var result = {
success: false,
message: 'Something went wrong',
data: {} // or []
}
效果很好,给我带来了很好的代码标准化快乐。
然而,今天,我意识到我的服务器端代码假定它总是能够对返回的内容进行完全序列化。现在我想序列化其中一个“数据”有效负载已经是它自己的格式良好的 JSON 字符串的人。
这是一直有效的一般模式:
bool success = false;
string message = "Something went wrong";
object jsonData = "[{\"id\":\"0\",\"value\":\"1234\"}]"; // Broken
dynamic finalData = new { success = success, message = message, data = jsonData };
JsonResult output = new JsonResult
{
Data = finalData,
JsonRequestBehavior = JsonRequestBehavior.AllowGet,
MaxJsonLength = int.MaxValue
};
return output;
问题在于,“data”元素在到达浏览器时将作为字符串接收,而不是作为正确的 JSON 对象(或上例中的数组)。
有没有什么方法可以用“序列化为原始”的属性来装饰属性,或者我是否正在编写自定义 JSON 序列化程序来完成这项工作?
【问题讨论】:
-
你必须使用
json.parse。在此处阅读完整的详细信息developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… -
好吧,从技术上讲,您违反了自己的合同和标准。以前你期待一个object,现在你传递给它一个字符串。在我看来,这是一种不好的处理方式,但如果无法避免使用此字符串,您可以写
data = JsonSerializer.Deserialize(jsonData)。但请注意,您将序列化它只是为了稍后将其反序列化。 -
json.parse 在浏览器端。我正在尝试操纵服务器端的序列化。 Rob,您正是遇到了问题。我不想反序列化它,只是为了立即重新序列化它(实际上只是在已经非常好的 JSON 周围放置一个薄包装)。不过,我想我已经找到了一个解决方案,并将在明天发布。谢谢你们!
标签: c# json asp.net-mvc json-deserialization jsonresult