>_ DevTrendsfr

Langue

Accueil

Langages

Sections

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embarqué Sécurité
Java

Analyse JSON rapide en Java avec les nouvelles règles de sécurité de Fastjson2

logo fastjson

Si vous travaillez avec Java depuis plus de cinq ans, le nom Fastjson évoque probablement des sentiments mitigés. D'un côté, la bibliothèque était effectivement plus rapide que Jackson. De l'autre, les vulnérabilités de désérialisation classiques via AutoType ont transformé son utilisation en mal de tête permanent pour les spécialistes de la sécurité.

L'équipe d'Alibaba connaissait ces problèmes mieux que quiconque. Il y a deux ans, elle a essentiellement réécrit la bibliothèque de zéro. Découvrez Fastjson2 : un moteur repensé pour travailler avec JSON, où la sécurité et les performances sur les versions modernes de Java ont été prises comme fondement.

Comment la sécurité a changé

Le péché principal de la première version était le mécanisme AutoType. Il pouvait créer des objets Java arbitraires à partir d'une payload JSON directement pendant l'analyse. Les attaquants trouvaient régulièrement des moyens de contourner la liste intégrée de classes bloquées et de déclencher des RCE.

Dans Fastjson2, l'approche a changé dramatiquement. AutoType est maintenant désactivé par défaut, et le scan de classes fonctionne sans listes blanches codées en dur. Un SafeMode a été introduit, qui interdit complètement l'assemblage automatique d'objets arbitraires.

Tous les drapeaux de configuration sont maintenant définis sur OFF par défaut. La bibliothèque ne tente plus de deviner les types là où cela pourrait causer des dommages.

Fonctionnalités principales

Les développeurs ont ciblé les versions modernes de JDK, allant de Java 8 à Java 21. Le moteur est optimisé pour l'utilisation de Vector API, les types Record et les chaînes compactes.

Voici ce qui se démarque lors de la découverte de la bibliothèque :

  • Prise en charge de deux formats. JSON texte régulier et protocole binaire JSONB.
  • Analyse sélective rapide via JSONPath sans créer d'objets Java intermédiaires.
  • Modules d'extension pour Kotlin avec un DSL pratique et support complet de Spring Framework pour les versions 5 et 6.
  • Compilation native avec GraalVM Native Image prête à l'emploi.

Démarrage rapide en code

L'ajout de la bibliothèque implique d'inclure une seule dépendance dans pom.xml :

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

Un exemple simple d'analyse et de sérialisation semble familier :

import com.alibaba.fastjson2.JSON;

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

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

Si vous écrivez en Kotlin, le module fastjson2-kotlin propose des extensions concises. Le code s'avère nettement plus propre grâce à la fonction d'extension to<T>() :

import com.alibaba.fastjson2.*

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

val jsonBytes = user.toJSONByteArray()

Format binaire JSONB pour les microservices

Le JSON texte reste la norme pour les API REST, mais dans la communication inter-services, il perd du terrain en raison de sa taille excessive et des frais généraux de conversion de chaînes. Fastjson2 contient une implémentation intégrée du format binaire JSONB.

JSONB encode les types de données et la structure dans un ensemble d'octets compact. Cela permet des économies substantielles de trafic et accélère les services 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);

La compression avec l'option BeanToArray transforme un objet en tableau de valeurs sans répéter les noms de champs, rapprochant l'efficacité du format de celle de Protobuf ou Kryo.

Lecture sélective via JSONPath

Souvent, à partir d'une énorme réponse JSON d'un microservice, vous n'avez besoin d'extraire qu'un ou deux champs. Les analyseurs classiques comme Jackson construisent d'abord un arbre complet en mémoire ou créent un objet avec tous les champs, consommant des ressources CPU et mémoire.

Fastjson2 résout ce problème avec une implémentation de la norme SQL:2016 JSONPath. Il peut extraire des données directement depuis un flux d'octets brut :

byte[] payload = fetchLargeJsonFromNetwork();

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

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

Cette astuce est utile dans les pipelines de traitement de données à forte charge où les allocations d'objets inutiles dans la JVM entraînent immédiatement des pauses fréquentes du Garbage Collector.

Migration depuis la première version

Atteindre une compatibilité descendante complète lors d'un changement de version majeure est impossible, mais les auteurs ont essayé de faciliter la transition. Un module de compatibilité a été créé pour les projets s'appuyant sur l'ancienne API :

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

Il utilise les anciens packages groupId et com.alibaba.fastjson, mais fonctionne en interne sur le nouveau moteur v2. Cela permet de mettre à jour sans réécrire des centaines d'importations dans le code hérité.

Cependant, lors de la migration, vous devez tenir compte de changements importants :

  • L'analyse de références cycliques est désactivée par défaut.
  • La correspondance intelligente des champs (Smart Match) ne fonctionne plus prête à l'emploi.
  • Toutes les options du sérialiseur doivent être explicitement activées via JSONWriter.Feature.

Fastjson2 s'est avéré être un produit mature et solide. Les développeurs ont appris de leurs erreurs passées, éliminé les paramètres par défaut dangereux et ont donné à l'écosystème Java un outil véritablement rapide.

Essayez définitivement Fastjson2 si vous développez des services à forte charge, travaillez avec Spring 6 / GraalVM Native Image, ou cherchez une alternative aux formats de sérialisation lourds dans les projets Kotlin.

Projets similaires