【问题标题】:How to include nulls in JSON object as placeholders?如何在 JSON 对象中包含空值作为占位符?
【发布时间】:2014-05-09 21:19:46
【问题描述】:

我的项目将使用 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,然后使用三元语句将其分配给用户提供的真实值,或者将其保留为空。我的想法是我不必在后面的 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... 

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

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

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

我特意在这个例子中只填充了两个字段来简化测试。我希望得到一个我可以(最终)移交给 AJAX 的 JSON 对象,但我错过了一些东西。我还怀疑 JSONObject.NULL 可能不是 Javascript 构造,因为我实际上只能在 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;

【问题讨论】:

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


    【解决方案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 看看结果是否符合您的期望。

    【讨论】:

    • 感谢 Joel,您帮助我消除了一个根本性的误解。我花了几个小时才弄清楚如何创建 JS 对象(不是 JSON 对象,因为真的没有这样的东西),然后从我的表单中的输入中填充它,但我现在已经让它工作了。我已经更新了我的 OP 中的小提琴,我将使用工作代码更新 OP。再次感谢。
    • @delliottg 很高兴为您提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-17
    • 2019-10-19
    相关资源
    最近更新 更多