MsgPack - Null Check

Nisbo

Bekanntes Mitglied
Servus,

ich spiele gerade etwas mit MessagePack rum
https://github.com/msgpack/msgpack-java

soweit so gut nur können die Werte auch "null" sein
irgendwie stehe ich da jetzt geade auf dem Schauch wie ich da prüfe ob der Wert null ist oder nicht.

Ist er null wirft es eine Exception "Expected Int, but got Nil (c0)"
Ich möchte das jetzt ungern mit try catch lösen

Java:
MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(m.getPayload());
int     einInt         = unpacker.unpackInt();
String einString     = unpacker.unpackString();

Hat jemand eine Idee ?
 
Schaut wohl so aus als wenn ich das so lösen müsste falls ich nicht irgendeine Methode / Config übersehen habe

Java:
int einInt = unpacker.getNextFormat().equals("NIL") ? unpacker.unpackInt() : 0;
// oder
int einInt = unpacker.getNextFormat().equals("NIL") ? unpacker.unpackInt() : null;
 
Du meinst das hier ?
https://static.javadoc.io/org.msgpack/msgpack-core/0.8.13/org/msgpack/core/MessageUnpacker.html
die machen da aber auch nichts großartig anderes

Im Endeffekt macht ein NULL bei einem INT aber auch keinen Sinn
Hatte es dann erst so gelöst (hier ohne try/catch oder throw)

Java:
public Integer unpackIntOrNull (MessageUnpacker unpacker){
    return unpacker.getNextFormat() == MessageFormat.INT8 ?
           unpacker.unpackInt() : null;
}

aber wie gesagt ein NULL macht bei einem INT keinen Sinn
 
Ja, aber auf dem gedachten weg, nicht übern Stringvergleich 😉

Im Endeffekt macht ein NULL bei einem INT aber auch keinen Sinn
Hatte es dann erst so gelöst (hier ohne try/catch oder throw)

aber wie gesagt ein NULL macht bei einem INT keinen Sinn
Wenn er für deinen UseCase keinen Sinn macht, sollte die Exception geschmissen werden - NIL wäre da schließlich ein Fehler.
Ansonsten wäre das vermutlich eleganter mit Optional zu lösen, am besten auf Ebene des Frameworks.

Deine Variante funktioniert btw nur für int8, ist das Absicht?
 
War nur ein Beispiel

Java:
MessageFormat mF      = null;
       
       try {
           mF = unpacker.getNextFormat();
       } catch (MessageInsufficientBufferException | IOException d) {
           return standardReturn;
       }

        // INT
        if(mF == MessageFormat.INT8 || mF == MessageFormat.UINT8 ||
                mF == MessageFormat.INT16 || mF == MessageFormat.UINT16 ||
                mF == MessageFormat.INT32 || mF == MessageFormat.UINT32 ||
                mF == MessageFormat.POSFIXINT) {
            try {
                return unpacker.unpackInt();
            } catch (IOException e) {
                return standardReturn;
            }
        }
 

Zurück
Oben