Кодировать массив байтов Clojure в JSON

Мне нужно закодировать массив байтов Clojure в JSON. Я пытался сделать это с помощью add-encoder функция, например:

(add-encoder [Ljava.lang.Byte encode-seq)

Проблема в том, что читатель всегда жалуется на несоответствующий разделитель. Я пытаюсь закодировать что-то вроде следующего:

{:bytes #<byte[] [B@9de27c>}

Но это всегда дает мне

JsonGenerationException Cannot JSON encode object of class: class [B: [B@9de27c cheshire.generate/generate (generate.clj:147)

Итак, я пытаюсь добавить собственный кодировщик. Я даже делаю это правильно?


person ChrisM    schedule 10.06.2014    source источник
comment
Как вы анализируете массив байтов?   -  person Chris    schedule 15.11.2016


Ответы (1)


Хотя Clojure разрешает литеральные символы, содержащие ., как класс Java, названный этим символом, вы не можете указывать классы массивов как литералы Clojure, потому что читатель интерпретирует [ как токен, обозначающий начало вектора. Согласно этой теме, наиболее краткий способ получить класс байтового массива будет:

 (add-encoder (Class/forName "[B") encode-seq)
person Alex    schedule 10.06.2014
comment
Что ж, это действительно сработало. Спасибо. Единственная проблема заключается в том, что массив может быть очень большим, и этот метод будет создавать побайтовое представление. Есть ли способ обрезать его? - person ChrisM; 11.06.2014
comment
Я уверен, что есть много способов сократить массив байтов путем его кодирования, сжатия или усечения. Какой из них использовать, зависит от того, как будет использоваться JSON, например. вам нужно иметь возможность воспроизводить исходный массив байтов из закодированной формы? Но проблема выбора кодировщика прямо противоположна настройке Cheshire для использования этого кодировщика. - person Alex; 11.06.2014
comment
Ну, настоящие байты меня не интересуют. Итак, в конце концов я выбрал: (add-encoder (Class/forName "[B") (fn [c jg] (.writeString jg (format "#<byte[] %s>" c)))) - person ChrisM; 11.06.2014