如何在JSON对象中包含空值作为占位符?

时间:2014-05-09 21:19:47

标签: c# javascript jquery json asp.net-ajax

我的项目将使用HTML 5,& jQuery Mobile前端,并通过AJAX传回JSON数据&回到与MySQL数据库对话的C#ASP.NET后端(下面的例子中没有显示任何后端C#,MySQL或AJAX代码)。

我已经弄清楚我的JSON对象(字符串?)会是什么样子,这是一个节省空间的简化版本:

{
    "Events": {
        "Common": {
            "User": "string",
            "PCBID": 52759,
            "Notes": "string"
        },
        "Assign": {
            "SBEPN": "string",
            "SBEJobNumber": "string",
            "SBESerialNumber": "string",
            "SBEModelNumber": "string"
        }
    }
}

对于每个事件,将始终填充公共节点,并且根据事件类型(分配,创建,修改等),将填充一些数据,其余可用变量将不会。为简洁起见,我只包含了Assign节点,但在它下面还有其他五个更复杂的节点。

我以为我可以将JS中的变量预分配给nullJSONObject.NULL,然后使用三元语句为用户提供它的真值,或者保留为null。这个想法是我不必在c#代码后面有一堆重载,我可以传入一大堆JSON,并根据已填充的内容或留空来弄清楚如何处理它。这是我试图声明变量的一种方式:

var user = JSONObject.NULL;
var pcbid = JSONObject.NULL;
var notes = JSONObject.NULL;
etc...

这些显示为未定义的JSONObject,如果我将它们声明为null,就像这样:

var user = null;
var pcbid = null;
var notes = null;
etc... 

它们显示为undefined而不是null,无论我是否JSON.stringify它们。

这就是我为变量分配字符串的方式:

user = $("#input_common_user").val() !== null ? $("#input_common_user").val() : JSONObject.NULL;
pcbid = $("#input_common_pcbid").val() !== null ? $("#input_common_pcbid").val() : JSONObject.NULL;
notes = $("#input_common_notes").val() !== null ? $("#input_common_notes").val() : JSONObject.NULL;

这是a working fiddle with all the various variables & events defined

我故意只在这个例子中填充了两个字段来简化测试。我希望得到一个JSON对象,我可以(最终)交给AJAX,但我遗漏了一些东西。我还怀疑JSONObject.NULL可能不是Javascript构造,因为我实际上只能在Android和Android中找到它的引用。 Java文档,但似乎我应该能够使用null吗?

所以,我的问题是,我怎样才能将空值作为文本/整数/布尔值的占位符获取到JSON对象中?这些占位符可能会或可能不会被用户填充?

编辑以显示功能代码(请参阅上面小提琴链接的完整示例):

声明我的JS对象:

var pcbClientEvent = {
    eventType: {
        common: {
            user: null,
            pcbid: null,
            notes: null
        },
        assign: {
            sbePN: null,
            sbeJobNumber: null,
            sbeSerialNumber: null,
            sbeModelNumber: null
        }
    }
};

在表格填写完成后操纵它(参见上面小提琴链接的完整示例):

pcbClientEvent.eventType.common.user = $("#input_common_user").val() !== undefined ? $("#input_common_user").val() : pcbClientEvent.eventType.common.user;
pcbClientEvent.eventType.common.pcbid = $("#input_common_pcbid").val() !== undefined ? $("#input_common_pcbid").val() : pcbClientEvent.eventType.common.pcbid;
pcbClientEvent.eventType.common.notes = $("#input_common_notes").val() !== undefined ? $("#input_common_notes").val() : pcbClientEvent.eventType.common.notes;
pcbClientEvent.eventType.assign.sbePN = $("#input_assign_sbePN").val() !== undefined ? $("#input_assign_sbePN").val() : pcbClientEvent.eventType.assign.sbePN;
pcbClientEvent.eventType.assign.sbeJobNumber = $("#input_assign_sbeJobNumber").val() !== undefined ? $("#input_assign_sbeJobNumber").val() : pcbClientEvent.eventType.assign.sbeJobNumber;
pcbClientEvent.eventType.assign.sbeSerialNumber = $("#input_assign_sbeSerialNumber").val() !== undefined ? $("#input_assign_sbeSerialNumber").val() : pcbClientEvent.eventType.assign.sbeSerialNumber;
pcbClientEvent.eventType.assign.sbeModelNumber = $("#input_assign_sbeModelNumber").val() !== undefined ? $("#input_assign_sbeModelNumber").val() : pcbClientEvent.eventType.assign.sbeModelNumber;

1 个答案:

答案 0 :(得分:1)

JSON 是一种轻量级的数据交换格式。根据JSON考虑应用程序的数据模型会很有帮助,但它并不意味着在代码中直接操作的东西。声明和修改运行时对象,将其序列化为JSON以进行传输并解析它以在接收端实例化等效的运行时对象更自然。 JSON.net只是应用程序ASP.NET后端的许多优秀JSON库之一。

特别是对于空值,这些在JSON中直接支持。例如,考虑这个Javascript对象:

var myObject = {
    a: "a string",
    b: 73,
    n : null
};

myObject上执行JSON.stringify的结果是:

 { "a": "a string", "b": 73, "n": null }

方法应该是操纵运行时对象并生成JSON,而不是组装JSON文本的片段。

尝试重新编写示例以在Javascript中构建代表性运行时对象并直接设置值,包括null个值。如果模型中有一个节点应该用JSON表示但是完全为空(所有null值),只需确保在模型的该位置分配合适的占位符对象。然后使用JSON.stringify查看结果是否符合您的期望。