Ich habe den folgenden Code geschrieben, um den Dateityp der Eingabe zu bestimmen, die vom Benutzer eingegeben wurde.
Update : Das Parsen in Float
wurde entfernt, da ein Double
-Wert auch in Float
bei Kosten einer gewissen Genauigkeit analysiert werden kann, wie von @DodgyCodeException
Ich muss das hunderte Male wiederholen und ich habe gelesen, dass Exception
eine teure Operation ist.
Gibt es einen besseren Weg, dies zu erreichen?
Mein Ansatz wäre, das Framework seine Sache machen zu lassen und es zu benutzen, um die Eingabe generisch zu analysieren:
%Vor% Vielleicht verwenden Sie eine switch
-Anweisung oder eine Map
anstelle einer langen Liste von if
-Konstrukten. Und fangen Sie JSONException
für Eingabe, die nicht gültig JSON ist.
Könnte vielleicht vereinfacht werden, um obj.getClass()
oder obj.getClass().getSimpleName()
für fast identische Funktionalität zu dem zurückzugeben, was Sie jetzt haben.
Ehrlich gesagt mag ich die Idee nicht, den Typ durch Parser-Ausnahmen zu bestimmen. Ich würde für jedes Format ein Muster erstellen und über alle von ihnen iterieren, um zu überprüfen, ob die angegebene Zeichenfolge mit einer von ihnen übereinstimmt.
Es ist ähnlich, wie die Klasse Scanner
funktioniert, aber es ist ziemlich kompliziert. Es ist schwierig, die regulären Ausdrücke zu schreiben, die alle möglichen Fälle abdecken sollten.
Aber wenn die Regexes vorbereitet sind, ist der Algorithmus einfach:
%Vor% Hier ist ein interessanter Teil - ein Beispiel für integerPattern()
. Ich habe es von Scanner
genommen und es ein wenig vereinfacht:
Ich bin mir ziemlich sicher, dass du alle Regexes googeln oder sie hier finden kannst.
Aber was ist, wenn es eine "leichtere" Lösung gibt oder Sie einfach keinen Regex-Ansatz verwenden wollen?
Sie können verschiedene Techniken mischen, indem Sie Map<String, Predicate<String>>
:
Ich glaube, es ist besser lesbar, es verringert die Verschachtelungstiefe und kapselt verschiedene Logik in separaten Methoden.
Das lange und kurze ist es:
Für die Fertigstellung gibt es jedoch ähnliche Dinge, die Sie erreichen können, ohne diese Ausnahmen zu erfassen - bitte beachten Sie, dass ich keine Benchmarks gemacht habe und diese Ergebnisse möglicherweise schneller sind oder nicht dein Fall!
Um herauszufinden, ob etwas JSON ist, Es gibt eine mayBeJSON()
-Methode in JSON-lib , aber es ist eine ziemlich veraltete Bibliothek (letzte Aktualisierung 2010).
Wenn Sie wissen wollen, ob etwas speziell in einen int passt, dann gibt es keinen anderen vernünftigen Weg als den NFE off parseInt()
wirklich zu fangen. Wenn Sie jedoch nur wissen möchten, ob etwas eine Zahl ist, können Sie einfach eine Regex verwenden:
(Andere Regexe werden online für Dezimalzahlen, Zahlen mit Exponenten usw. einfach berechnet / gefunden.)
Oder Sie könnten es streamen und jedes Zeichen einzeln überprüfen:
%Vor% Alternativ können Sie Ihre Ausnahmeregelungen mit NumberUtils.isCreateable () von Apache Commons ( isParseable()
, und andere Methoden in dieser Klasse können ebenfalls nützlich sein.)
Ich möchte wissen, ob die Eingabe ein json / jsonarray ist oder nicht.
Sie müssen mit JSONException
umgehen, um den JSON-Typ zu bestimmen, und dann können Sie NumberFormat parse () Methode, um die anderen Typen zu bestimmen, wie unten gezeigt: