在Java中将JSON Base64字符串转换为String

时间:2017-03-04 15:49:55

标签: java json protocol-buffers

我正在尝试使用com.google.protobuf.util.JsonFormat类将protobuf流转换为JSON对象。

String jsonFormat = JsonFormat.printer().print(data);

根据文档https://developers.google.com/protocol-buffers/docs/proto3#json我得到的字节为Base64字符串(例如“hashedStaEthMac”:“QDOMIxG + tTIRi7wlMA9yGtOoJ1g =”, )。但是我想让它成为一个可读的字符串(例如“locAlgorithm”:“ALGORITHM_ESTIMATION”, )。以下是示例输出。有没有办法通过JSON对象作为平面文本或任何解决方法来获取实际值。

{
  "seq": "71811887",
  "timestamp": 1488640438,
  "op": "OP_UPDATE",
  "topicSeq": "9023777",
  "sourceId": "xxxxxxxx",
  "location": {
    "staEthMac": {
      "addr": "xxxxxx"
    },
    "staLocationX": 1148.1763,
    "staLocationY": 980.3377,
    "errorLevel": 588,
    "associated": false,
    "campusId": "n5THo6IINuOSVZ/cTidNVA==",
    "buildingId": "7hY/jVh9NRqqxF6gbqT7Jw==",
    "floorId": "LV/ZiQRQMS2wwKiKTvYNBQ==",
    "hashedStaEthMac": "xxxxxxxxxxx",
    "locAlgorithm": "ALGORITHM_ESTIMATION",
    "unit": "FEET"
  }
}

预期格式如下。

seq: 85264233
timestamp: 1488655098
op: OP_UPDATE
topic_seq: 10955622
source_id: 00505698749E
location {
    sta_eth_mac {
        addr: xx:xx:xx:xx:xx:xx
    }
    sta_location_x: 916.003
    sta_location_y: 580.115
    error_level: 854
    associated: false
    campus_id: 9F94C7A3A20836E392559FDC4E274D54
    building_id: EE163F8D587D351AAAC45EA06EA4FB27
    floor_id: 83144E609EEE3A64BBD22C536A76FF5A
    hashed_sta_eth_mac: 
    loc_algorithm: ALGORITHM_ESTIMATION
    unit: FEET
}

1 个答案:

答案 0 :(得分:2)

不容易,因为实际值是二进制的,这就是他们首先进行Base64编码的原因。

尝试解码其中一个值:

$ echo -n 'n5THo6IINuOSVZ/cTidNVA==' | base64 -D
??ǣ6?U??N'MT

为了获得更多可读值,您必须了解二进制数据的实际内容,然后确定要用于显示它的格式。

名为staEthMac.addr的字段为6个字节,可能是以太网MAC地址。它通常显示为xx:xx:xx:xx:xx:xx其中xx是每个字节的十六进制值。因此,您可以将Base64字符串解码为byte[],然后调用函数将每个字节转换为十六进制,并用':'分隔它们。

字段campusId,buildingId和floorId是16个字节(128位),可能是UUID。 UUID通常显示为xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,其中每个x是十六进制数字(4位)。所以你可以(再次)将Base64字符串转换为byte[],然后打印十六进制数字,可选择添加短划线。

不确定sourceId和hashedStaEthMac,但您可以按照转换为byte[]并以十六进制打印的模式。从本质上讲,你只是在从64号基地到16号基地进行转换。你最终会遇到这样的事情:

$ echo -n 'n5THo6IINuOSVZ/cTidNVA==' | base64 -D | xxd -p
9f94c7a3a20836e392559fdc4e274d54

我不确定你得到的一点是它的二进制数据。没有"可读"有意义的版本,如#34; ALGORITHM_ESTIMATION"做;您可以做的最好的事情是使用字母和数字对二进制数据进行编码,这样您至少可以发音。

Base64(使用64个不同的字符对二进制编码)是可发音的" N five T H lowercase-O six ..."但它不是真正的友好,因为字母案例很重要,因为它使用像O和I这样看起来像数字的字母。十六进制(使用16个字符编码二进制文件)更容易阅读。