Angenommen, das folgende einfache JSON-Dokument:Wie ändert man den Wert und gibt JSON mit dem Argonaut-Objektiv ein?
{
"key" : "val1"
}
Ich mag würde den Wert des „Schlüssels“ aktualisieren, aber zugleich auch seine Art ändern, so von Zeichenkette, die es in ein int ändern. Nun, wie ein HCURSOR mit unten ist es möglich, und gerade nach vorne, es zu tun:
val cursor = js.hcursor
val position = (cursor --\ "key") >-> (_ => jNumber(1))
Mit „Verhängnis“ die obige Position ich ein neues json am Ende mit dem „Schlüssel“ einen numerischen Wert hat und nicht einen String Das ist perfekt.
Ist es möglich, dasselbe mit Linsen zu tun? Ich habe versucht, die folgenden Funktionen ausführen:
val lense = jObjectPL >=>
jsonObjectPL("key") >=>
jNumberPL
lense.mod(_ => JsonBigDecimal(1), js)
Aber obwohl ich es nicht einen Fehler auch nicht, ich unmodifizierten am Ende mit dem ursprünglichen json Dokument am Ende nicht funktioniert. Wenn ich jedoch den Datentyp respektiere, funktionieren die Dinge so, wie sie sollten. Gibt es einen Grund, dass Objektive nur für Änderungen desselben Datentyps verwendet werden sollten? Oder ich mache gerade etwas schrecklich falsch :)
Danke für die schnelle Antwort @Travis! sehr geschätzt. Beim Lesen der Dokumentation für Objektive & Argonaut hatte ich den Eindruck, dass Sie immer den JSON-Datentyp definieren sollten, den Sie erwarten. Aber ich denke, es ist ein Teil der menschlichen Natur, Dinge manchmal zu komplizieren :) – cpard
@cpard Yep :). In diesem Fall erwarten Sie eine JSON-Zeichenfolge an dieser Position, aber wenn Sie dem Objektiv "jStringPL" hinzufügen, können Sie diesen Typ nicht ändern. –