2016-08-01 14 views
1

Ich habe Code, der Formularfelder aufnimmt und sie in eine JSON-Zeichenkette konvertiert, die für die Weitergabe an eine REST-API geeignet ist (speziell die Marathon-REST-API). Das Problem ist, dass JSON.stringify alle Formularfeldwerte doppelt anführt, sogar diejenigen, die numerisch sind, was dazu führt, dass der Ajax-Aufruf fehlschlägt. Hier ist der String meinen Code produziert:Wie man numerische Felder in JSON.stringify erhält

{"id":"basic-1","cpus":"0","mem":"32","instances":"1","cmd":"while [ true ] ; do echo 'Hello Marathon' ; sleep 5 ; done"} 

Die mem, CPUs und Instanzen Werte sollten nicht doppelt angegeben werden, weil sie numerisch sind.

data: JSON.stringify($('form').MytoJson()); 

MytoJson ist eine Funktion, die die Formularfelder serialisiert. Das funktioniert gut. Das Problem ist, dass JSON.stringify die Anführungszeichen um die Schlüssel und alle Werte, einschließlich der numerischen Werte, platziert, die den Ajax-Aufruf fehlschlagen lassen.

Die JSON.stringify-Funktion benötigt zwei Argumente. Das erste Argument ist eine Ersetzungsfunktion, die eine Funktion oder ein Array sein kann. Betrachten Sie diese replacer Funktion:

function replacer(key, value) { 
    if (typeof value === "string") { 
     return undefined; 
    } 
    return value; 
} 
JSON.stringify($('form').MytoJson(), replacer); 

ich diese replacer Funktion nicht numerische Werte ändern möchten zitieren. Ich frage mich, ob ich die HTML5-Formularattribute verwende, um zwischen Zeichenfolgen- und numerischen Formularfeldern zu unterscheiden? Betrachten Sie dieses Formularfeld:

<input id="cpus" type="number" name="cpus" value="0.1" /> 

Wie kann ich die Tatsache nutzen, dass dieses Feld das Attribut Typ hat = „number“ in der replacer Funktion? Ich möchte die Replacer-Funktion ändern, um keine Werte zu zitieren, wenn das Formularfeld vom Typ Nummer ist.

+0

Dies sollte nicht dazu führen, dass der Ajax-Aufruf fehlschlagen - ich schätze, Sie verwenden einen POST oder PUT - dies sollte immer noch die Daten an Ihren Service senden - was Sie tun müssen, ist in Ihrem Dienst, um diese dann zu konvertieren Stringwert zu numerisch, bevor er an Ihre Datenbank übergeben wird. Es ist eine Standardprozedur, Numerik zu stringulieren, bevor sie an einen erholsamen Dienst gesendet wird. – Sprose

Antwort

1

Um eine stringifyed Zeichenfolge zurück in Daten zu drehen, würden Sie JSON.parse(stringifyedString);

Verwenden Sie einfach die Zitate aus einem String entfernt werden "5" in eine Number nicht konvertieren, zum Beispiel. Es wird nur eine Zeichenfolge mit dem Zeichen 5.

+0

Guter Punkt. Ich verwende jetzt 'parseFloat()', um den String in eine Gleitkommazahl in meiner Reduzierfunktion umzuwandeln. Bitte siehe oben. –

1

Ich bin nicht 100%, aber ich stelle mir vor, dass das Problem durch den Code verursacht wird, der die Werte der Formularfelder liest - nämlich liest er die Werte als Zeichenfolgen (was sie sind).

Sie müssen alle numerischen Werte in einen tatsächlichen JS Number umwandeln. Versuchen Sie, die folgende replacer Funktion:

function replacer(key, value) { 

    var ret = (value === value * 1) 
      ? value * 1 
      : value; 

    return ret; 

} 

Diese überprüfen sollten, wenn jeder Wert numerisch ist, und wenn ja, wandelt es in ein Number

+0

Sie haben Recht. Der Schlüssel war, die numerischen Felder in Fließkommazahlen umzuwandeln. Ich bin überrascht, dass es keine Bibliothek gibt, um dies bereits zu tun - um den Formularfeldertyp zu betrachten und die Daten in den passenden Typ für die JSON-Zeichenkette umzuwandeln. Oder vielleicht habe ich es einfach nicht gefunden. –

0

Hier ist die Lösung. Ich habe die Replacer-Funktion geändert, um den HTML5-Formularfeldtyp zu verwenden, um zwischen Formularfeldern zu unterscheiden, die zitiert oder nicht zitiert werden sollten.

function replacer(key, value) { 
    //console.log(typeof($(eval('\'#' + key + '\'')).attr('type'))); 
    if ($(eval('\'#' + key + '\'')).attr('type') == null) { 
     return value; 
    } 
    return parseFloat(value); 
} 

Da ist in meinem Ajax-Code:

data: JSON.stringify($('form').MytoJson(), replacer); 

Es scheint, dass das ‚Typ‘ Attribut für Standard ‚Text‘ Eingabefelder nicht definiert ist, aber es wird definiert, wenn der Typ ‚Zahl‘. Ich benutze das.

Wenn das Attribut type nicht definiert ist, gebe ich einfach den Wert zurück, der in der JSON-Zeichenfolge enthalten und doppelt zitiert wird.Wenn das Attribut type definiert ist, wird der Wert in einen Gleitkommawert umgewandelt. Es wird in die nicht zitierte JSON-Zeichenfolge eingeschlossen. Dies ist eine funktionierende Lösung für jetzt aber ich bin mir sicher, dass ich in naher Zukunft wieder besuchen muss.