【问题标题】:Java MessagePack null checkJava MessagePack 空值检查
【发布时间】:2017-07-29 09:03:00
【问题描述】:

我正在努力熟悉Messagepack for Java

我通过 Mqtt 获取数据。如果变量不是null,一切都很好,但变量也可以是null,在这种情况下我会得到这个异常:Expected Int, but got Nil (c0)

MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(m.getPayload());
int someInt              = unpacker.unpackInt();
String someString        = unpacker.unpackString();

到目前为止,我无法弄清楚如何找回 NULL 我想避免使用 TRY/CATCH,所以目前我正在使用这种方式

int someInt = unpacker.getNextFormat().equals("NIL") ? unpacker.unpackInt() : null;

有没有更好的方法?

【问题讨论】:

  • 应该是相反的,不是吗? Integer einInt = unpacker.getNextFormat().equals("NIL") ? null : unpacker.unpackInt(); int 无法接收空值。
  • 你当然是对的,谢谢提醒 :)
  • 请确保在 Stackoverflow 上留下的所有答案、问题和评论都是英文的。这也包括变量名。谢谢!

标签: java null msgpack


【解决方案1】:

我查看了MessageUnpacker 的 javadoc,它似乎没有提供更好的方法。

示例代码非常接近您的方式:

 MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(...);
 while(unpacker.hasNext()) {
     MessageFormat f = unpacker.getNextFormat();
     switch(f) {
         case MessageFormat.POSFIXINT:
         case MessageFormat.INT8:
         case MessageFormat.UINT8: {
            int v = unpacker.unpackInt();
            break;
         }
         case MessageFormat.STRING: {
            String v = unpacker.unpackString();
            break;
         }
         // ...
   }
 }

所以我认为你在正确的道路上。
但是,如果您多次重复此检索(而且很有可能),您可以引入实用方法来为您完成这项工作。

例如unpackInt()

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

现在,解包元素非常直接:

Integer einInt = unpackIntOrNull(unpacker);
Integer einAndereInt = unpackIntOrNull(unpacker);
...

【讨论】:

  • 感谢答案 看起来需要 .toString() unpacker.getNextFormat().toString().equals("NIL")
  • 是的,因为您不使用 MessageFormat 枚举类,而是使用 String : "NIL" 与枚举值的 toString() 表示进行比较。我进行了编辑以显示如何避免它。就像在示例代码中一样。
【解决方案2】:

MessageUnpacker 有一个名为tryUnpackNil 的方法。如果下一个字节为 nil 值,则此方法读取它并返回 true,否则不读取任何内容并返回 false

这可用于跳过 nil 值,并使用例如:

解压缩非 nil 值
final MessageUnpacker unpacker = MessagePack.newDefaultUnpacker(data);
final Integer value = unpacker.tryUnpackNil() ? null : unpacker.unpackInt();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2013-05-16
    • 2014-05-31
    • 1970-01-01
    相关资源
    最近更新 更多