Wie gehe ich mit potenziell „falschen' Eingaben in JSON um? Diskussion von Alternativen
P粉161939752
P粉161939752 2023-09-10 09:35:21
0
2
566

Angenommen, ich bin mir nicht sicher, ob es authorities(但如果存在,我希望选择它们)。如果没有选中的authorities,我希望jQuery选择authoritiess gibt, die überprüft werden, unabhängig davon, ob sie ausgewählt sind (eigentlich bedeutet dies, den Wert der versteckten Eingabe abzurufen). Meine Gedanken zur Verwendung des „wahren Werts“/„falschen Werts“-Konzepts von JS zur Bewältigung dieser Situation sind:

    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())
    };

Es funktioniert jedoch nicht. Interessanterweise funktioniert es im folgenden Codeausschnitt. Könnte es sein, dass val()在匹配失败时返回的undefined不是“假值”吗?想想看!我最好的猜测是,当解析undefined时,JSON.parse() einen Fehler auslöst, anstatt einen „falschen Wert“ zurückzugeben, was ich hoffe. Diese Methode akzeptiert kein „param OR param“, oder?

Wie sollte ich Ihrer Meinung nach einen Fallback für diese Situation bereitstellen (außer natürlich, den „falschen Wert“ der ausgewählten authorities einzeln zu überprüfen, was für meinen Geschmack etwas ausführlich ist)?

 

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


<标题>Verwaltungsseite

<正文>
<标题> Name Nachname Abteilung E-Mail <正文>

Füllen Sie das Formular aus

<表格>
<标签=“名称”>Name:
<脚本> $(document).ready(function() { $('form').on('submit', asynchrone Funktion (Ereignis) { event.preventDefault(); $('tbody').append( `` ); const SubmitButton = $(this).find('[type=submit]'); Konstante Form = $(this); Senden button.removeClass('btn-primary') .addClass('btn-success') .attr('value', 'Benutzer wurde hinzugefügt!') .attr('type', 'button') .click(() => $('[href="#users-table"]').tab('show')); setTimeout(function(){ commitButton.removeClass('btn-success') .addClass('btn-primary') .attr('value', 'submit') .attr('Typ
P粉161939752
P粉161939752

Antworte allen(2)
P粉818306280

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

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

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

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

  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())
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
John US-Energieministerium ES john_d@gmail.com
Jane US-Energieministerium Personalwesen jane_d@gmail.com
${$(this).find('[name=name]').val()} ${$(this).find('[name=last-name]').val()} ${$(this).find('[name=Abteilung]').val()} ${$(this).find('[name=email]').val() || 'Nicht zutreffend'}