搜索

首页  >  问答  >  正文

如何处理JSON中可能为"假值"的输入?备选方案探讨

假设,我不确定是否存在已选中的authorities(但如果存在,我希望选择它们)。如果没有选中的authorities,我希望jQuery选择authorities,无论它们是否被选中(实际上,这意味着检索隐藏输入的值)。我对使用JS的“真值”/“假值”概念来处理这种情况的想法是:

    let user = {
        id: $(this).find('[name=id]').val(),
        username: $(this).find('[name=username]').val(),
        password: $(this).find('[name=password]').val(),
        name: $(this).find('[name=name]').val(),
        lastName: $(this).find('[name=lastName]').val(),
        department: $(this).find('[name=department]').val(),
        salary: $(this).find('[name=salary]').val(),
        age: $(this).find('[name=age]').val(),
        email: $(this).find('[name=email]').val(),
        enabledByte: $(this).find('[name=enabledByte]').val(),
        authorities: JSON.parse($(this).find('[name=authorities]:checked').val()) || 
                    JSON.parse($(this).find('[name=authorities]').val())
    };

然而,它不起作用。有趣的是,它在下面的代码片段中确实起作用。难道val()在匹配失败时返回的undefined不是“假值”吗?想想看!我最好的猜测是,当解析undefined时,JSON.parse()会抛出错误,而不是返回一些我希望的“假值”。这个方法不接受“param OR param”,对吗?

你认为我应该如何提供这种情况的回退(除了当然,单独检查选中的authorities的“假值”,这对我来说有点冗长)?

 

<头>
<元字符集=“UTF-8”>


<标题>管理页面

<正文>
<标题> 名称 姓氏 部门 电子邮件 <正文>

填写表格

<表格>
<标签=“名称”>名称:
<脚本> $(文档).ready(函数() { $('form').on('提交', 异步函数(事件) { event.preventDefault(); $('tbody').append( `` ); const SubmitButton = $(this).find('[type=submit]'); 常量形式 = $(this); 提交按钮.removeClass('btn-primary') .addClass('btn-成功') .attr('value', '用户已添加!') .attr('类型', '按钮') .click(() => $('[href="#users-table"]').tab('show')); 设置超时(函数(){ commitButton.removeClass('btn-成功') .addClass('btn-primary') .attr('值', '提交') .attr('类型
P粉161939752P粉161939752449 天前553

全部回复(2)我来回复

  • P粉818306280

    P粉8183062802023-09-11 00:47:41

    问题在于如果选择器找不到任何匹配项,.val()返回undefined,而JSON.parse(undefined)会引发异常。

    JSON.parse()的参数列表中执行备用方案,这样您将解析成功获取的任何值。

    authorities: JSON.parse($(this).find('[name=authorities]:checked').val() || 
                            $(this).find('[name=authorities]:first').val())

    回复
    0
  • P粉561323975

    P粉5613239752023-09-11 00:35:45

    根据您的使用情况,您有几个选项:

    1. 您可以像这样组合JSON.parse。这将使它在解析之前回退到其他字符串,因此如果第一个值是undefined,它不会出错。但是,如果两个值都是undefined或其中一个是无效的JSON,这将导致错误。
    JSON.parse($(this).find('[name=authorities]:checked').val()) || $(this).find('[name=authorities]').val());
    
    1. 如果您知道这些值要么是有效的JSON,要么是undefined,您可以回退到nullnull是一个有效的JSON值,可以解析。但是,如果任何一个值是无效的JSON,仍然会出错。
    JSON.parse($(this).find('[name=authorities]:checked').val()) || $(this).find('[name=authorities]').val() || null);
    
    1. 如果有可能任何一个值都是无效的JSON,您可以将其包围在try/catch块中。这样,即使它是无效的,也不会抛出错误。这是最安全的选项,永远不会出错。
    // Helper to make it easier to do this inline
    function safeJsonParse(string) {
      try {
        return JSON.parse(string);
      } catch {
        // JSON is invalid. Will implicitly return undefined.
      }
    }
    
    safeJsonParse($(this).find('[name=authorities]:checked').val()) || safeJsonParse($(this).find('[name=authorities]').val())
    

    回复
    0
  • 取消回复
  • 约翰 美国能源部 IT john_d@gmail.com
    美国能源部 人力资源 jane_d@gmail.com
    ${$(this).find('[name=name]').val()} ${$(this).find('[name=last-name]').val()} ${$(this).find('[name=部门]').val()} ${$(this).find('[name=email]').val() || '不适用'}