我已经阅读到Smile和JSON之间的转换可以在以下几个来源中有效完成:


这意味着可以在不丢失信息的情况下高效地完成JSON和Smile之间的转换。 (github, jackson-docs);
两种格式兼容:通过包装适当的解码器,您可以发送Smile和解码为JSON。 (stackoverflow


甚至Wikipedia:... ...这意味着,只要存在正确的编码器/解码器供工具使用,也可以将基于JSON的工具与Smile一起使用。

不幸的是,除了关于编码器/解码器的信息,我在任何来源都找不到任何有用的信息。

因此,一般的问题是如何做到这一点?


有内置的方法可以做到这一点吗?
如果没有,是否有一些自定义且已实施的解决方案?
如果没有,请给我一些有关编写编码器/解码器的提示。

最佳答案

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();
    }
}

09-27 14:25