2016-02-02 5 views
2

Я прочитал, что преобразование между Улыбкой и JSON можно сделать эффективно в нескольких источниках:Эффективного преобразования между Улыбкой и JSON

  • Это означает, что преобразование между JSON и улыбкой может быть сделано эффективно и без потеря информации. (github, jackson-docs);
  • Эти два формата совместимы: вы можете отправить Smile и декодировать как JSON, обернув соответствующий декодер. (stackoverflow)

И даже Wikipedia: ... что означает, что инструменты, которые работают на JSON можно использовать с улыбкой, как хорошо, до тех пор, как надлежащий кодер/декодер существует инструмент для использования

К сожалению, я не нашел ничего полезного ни в одном из источников, кроме информации о кодере/декодере.

Итак, общий вопрос: как это можно сделать?

  • Есть ли какой-либо встроенный способ для этого?
  • Если нет, есть ли какие-то пользовательские и уже реализованные решения?
  • Если нет, сообщите мне несколько советов о написании кодировщика/декодера.

ответ

2
public class JsonSmileMigrationService 
{ 
    private static final Logger log = LoggerFactory.getLogger(JsonSmileMigrationService.class); 

    public static byte[] convertToSmile(byte[] json, JsonFactory jsonFactory, SmileFactory smileFactory) 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

     try // try-with-resources 
     (
      JsonGenerator jg = smileFactory.createGenerator(bos); 
      JsonParser jp = jsonFactory.createParser(json) 
     ) 
     { 
      while (jp.nextToken() != null) 
      { 
       jg.copyCurrentEvent(jp); 
      } 
     } 
     catch (Exception e) 
     { 
      log.error("Error while converting json to smile", e); 
     } 

     return bos.toByteArray(); 
    } 

    public static byte[] convertToJson(byte[] smile, JsonFactory jsonFactory, SmileFactory smileFactory) 
    { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 

     try // try-with-resources 
     (
      JsonParser sp = smileFactory.createParser(smile); 
      JsonGenerator jg = jsonFactory.createGenerator(bos) 
     ) 
     { 
      while (sp.nextToken() != null) 
      { 
       jg.copyCurrentEvent(sp); 
      } 
     } 
     catch (Exception e) 
     { 
      log.error("Error while converting smile to json", e); 
     } 

     return bos.toByteArray(); 
    } 
} 
2

Я не могу оценить, насколько eficient это МО, однако, это просто простой способ хорошо работает: создать картограф Джексоне SmileFactory, дайте ему экземпляр JsonNode и его карты ввода в байты [] улыбнутся данные:

public static void main(String[] args) 
{ 
    ObjectMapper jsonMapper = new ObjectMapper(); // just for testing! 
    ObjectMapper smileMapper = new ObjectMapper(new SmileFactory()); 

    // create json test data 
    SmileDemo sd = new SmileDemo(); 
    System.out.println("ORIGINAL " + sd.str + " " + sd.i + " " + sd.flt + " " + sd.dbl + " " + sd.bool + " " + sd.date); 
    JsonNode json = jsonMapper.valueToTree(sd); 
    try { 
     // the following line is the actual conversion 
     byte[] smileData = smileMapper.writeValueAsBytes(json); 
     // test the conversion 
     sd = smileMapper.readValue(smileData, SmileDemo.class); 
     System.out.println("CONVERTED " + sd.str + " " + sd.i + " " + sd.flt + " " + sd.dbl + " " + sd.bool + " " + sd.date); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

public static class SmileDemo 
{ 
    public String str = "Hello World"; 
    public int i = 1000; 
    public float flt = 1000.34F; 
    public double dbl = 1000.34D; 
    public boolean bool = false; 
    public java.util.Date date = new Date(2016, 1, 1); 
} 
+0

Не могли бы вы пояснить, как он решает мою проблему? Я не вижу ничего, кроме сериализации/десериализации в/из Smile ... Позвольте мне осветить еще один свет на мой вопрос: у меня есть массив байтов, который я получил при сериализации объекта Smile ('smileData' в вашем случае). Я хочу преобразовать этот массив байтов в строку JSON. Конечно, самым простым решением было бы десериализовать его, а затем сериализовать в JSON. Не кажется эффективным ... –

+0

Вы правы. Это действительно то, что предлагается, и у меня нет лучшего решения. –

1

Google нашел меня это class, который содержит преобразование из массива байтов JSon улыбаться один (сделайте поиск convertToSmile). возможно, это помогает?

+0

+1 Но на самом деле это однонаправленное преобразование. Последовательное преобразование с обеих сторон, и я буду принимать его в качестве ответа. В противном случае я это сделаю. –

Смежные вопросы