>_ DevTrendspt

Idioma

Início

Linguagens

Seções

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarcados Segurança
Java

Análise Rápida de JSON em Java com Novas Regras de Segurança no Fastjson2

Se você trabalha com Java há mais de cinco anos, o nome Fastjson provavelmente evoca sentimentos mistos em você. Por um lado, a biblioteca era de fato mais rápida que o Jackson. Por outro lado, vulnerabilidades regulares de desserialização através do AutoType transformaram seu uso em uma dor de cabeça constante para especialistas em segurança.

A equipe da Alibaba conhecia esses problemas melhor do que ninguém. Há dois anos, eles essencialmente reescreveram a biblioteca do zero. Conheça o Fastjson2: um mecanismo reimaginado para trabalhar com JSON, onde segurança e desempenho em versões Java modernas foram tomados como base.

Como a Segurança Mudou

O principal pecado da primeira versão foi o mecanismo AutoType. Ele podia criar objetos Java arbitrários a partir do payload JSON diretamente durante a análise. Os invasores regularmente encontraram maneiras de contornar a lista de classes bloqueadas integradas e acionar RCE.

No Fastjson2, a abordagem mudou drasticamente. O AutoType agora está desabilitado por padrão e a verificação de classe funciona sem listas de permissão codificadas. Um SafeMode foi introduzido, que proíbe completamente a montagem automática de objetos arbitrários.

Todas as flags de configuração agora são definidas como OFF por padrão. A biblioteca não tenta mais adivinhar tipos onde isso poderia causar danos.

Funcionalidades Principais

Os desenvolvedores visaram versões modernas do JDK, variando de Java 8 a Java 21. O mecanismo é otimizado para uso da Vector API, tipos Record e strings compactas.

Aqui está o que se destaca ao conhecer a biblioteca:

  • Suporte a formato duplo. Tanto JSON de texto regular quanto o protocolo binário JSONB.
  • Análise seletiva rápida via JSONPath sem criar objetos Java intermediários.
  • Módulos de extensão para Kotlin com uma DSL conveniente e suporte completo ao Spring Framework para versões 5 e 6.
  • Compilação nativa com GraalVM Native Image pronta para uso.

Início Rápido em Código

Adicionar a biblioteca envolve incluir uma única dependência em pom.xml:

<dependency>
    <groupId>com.alibaba.fastjson2</groupId>
    <artifactId>fastjson2</artifactId>
    <version>2.0.61</version>
</dependency>

Um exemplo simples de análise e serialização parece familiar:

import com.alibaba.fastjson2.JSON;

// Парсинг строки в объект
User user = JSON.parseObject("{\"name\":\"John\",\"age\":25}", User.class);

// Сериализация объекта в JSON
String json = JSON.toJSONString(user);

Se você escreve em Kotlin, o módulo fastjson2-kotlin oferece extensões concisas. O código fica notavelmente mais limpo graças à função de extensão to<T>():

import com.alibaba.fastjson2.*

val text = """{"id":1,"name":"John"}"""
val user = text.to<User>()

val jsonBytes = user.toJSONByteArray()

Formato Binário JSONB para Microsserviços

O JSON de texto permanece como o padrão para APIs REST, mas na comunicação entre serviços ele perde terreno devido ao tamanho excessivo e sobrecarga de conversão de strings. O Fastjson2 contém uma implementação integrada do formato binário JSONB.

O JSONB codifica tipos de dados e estrutura em um conjunto compacto de bytes. Isso fornece economia substancial de tráfego e acelera serviços RPC.

User user = new User(1, "John");

// Сериализация в байтовый массив JSONB
byte[] bytes = JSONB.toBytes(user);

// Сериализация с дополнительным сжатием структурированных данных
byte[] compactBytes = JSONB.toBytes(user, JSONWriter.Feature.BeanToArray);

// Обратный парсинг
User parsedUser = JSONB.parseObject(bytes, User.class);

A compressão com a opção BeanToArray transforma um objeto em um array de valores sem repetir nomes de campos, aproximando a eficiência do formato de Protobuf ou Kryo.

Leitura Seletiva via JSONPath

Frequentemente, de uma enorme resposta JSON de um microsserviço, você só precisa extrair um ou dois campos. Parsers clássicos como Jackson primeiro constroem uma árvore completa na memória ou criam um objeto com todos os campos, consumindo recursos de CPU e memória.

O Fastjson2 resolve esse problema com uma implementação do padrão JSONPath do SQL:2016. Ele pode extrair dados diretamente de um stream de bytes bruto:

byte[] payload = fetchLargeJsonFromNetwork();

// Создаём и кэшируем путь
JSONPath path = JSONPath.of("$.data.user.id");

// Извлекаем значение напрямую из байтового массива
JSONReader reader = JSONReader.of(payload);
Object userId = path.extract(reader);

Esse truque é útil em pipelines de processamento de dados de alta carga onde alocações de objetos desnecessárias na JVM imediatamente levam a pausas frequentes do Garbage Collector.

Migrando da Primeira Versão

Alcançar compatibilidade total com versões anteriores ao mudar versões principais é impossível, mas os autores tentaram facilitar a transição. Um módulo de compatibilidade foi criado para projetos que dependem da API antiga:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>2.0.61</version>
</dependency>

Ele usa os antigos pacotes groupId e com.alibaba.fastjson, mas internamente executa no novo mecanismo v2. Isso torna possível atualizar sem reescrever centenas de imports em código legado.

No entanto, ao migrar, você precisa considerar mudanças importantes:

  • A análise de referências cíclicas está desabilitada por padrão.
  • O correspondência de campos Smart Match não funciona mais prontamente.
  • Todas as opções do serializador devem ser explicitamente habilitadas através de JSONWriter.Feature.

O Fastjson2 se mostrou um produto maduro e sólido. Os desenvolvedores aprenderam com erros passados, eliminaram configurações padrão perigosas e deram ao ecossistema Java uma ferramenta verdadeiramente rápida.

Definitivamente experimente o Fastjson2 se você está desenvolvendo serviços de alta carga, trabalhando com Spring 6 / GraalVM Native Image, ou procurando uma alternativa para formatos de serialização pesados em projetos Kotlin.

Projetos relacionados