Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

erreur avec le module JSON::Parse


Sujet :

Modules Perl

  1. #1
    Membre émérite
    erreur avec le module JSON::Parse
    Bonjour à tous,


    J'utilise le module JSON:arse et j'obtiens l'erreur : JSON error at line 1, byte 3107978/181299978: Unexpected character 'N' parsing object starting from byte 3107382: expecting whitespace: '\n', '\r', '\t', ' ' or start of string: '"' or digit: '0-9' or minus: '-' or start of an array or object: '{', '[' or start of literal: 't', 'f', 'n' at C:/Perl64/site/lib/JSON/Parse.pm line 92. J'ai, au moins, une valeur numérique qui est à 'Nan'. Je ne trouve pas dans la documentation où changer les paramètres afin de permettre qu'une valeur numérique attendue puisse être autre chose. Est-ce possible ? D'avance merci, Jasmine.
    -- Jasmine --

  2. #2
    Rédacteur/Modérateur

    Peux-tu déterminer ce que contient ta chaîne JSON à l'endroit de l'erreur?

  3. #3
    Membre émérite
    Coucou,


    Merci pour ton intérêt à mon problème.

    Mon collègue a utilisé com.fasterxml.jackson, il avait le même problème et en changeant le paramètre « Non-standard token 'NaN': enable JsonParser.Feature.ALLOW_NON_NUMERIC_NUMBERS » … il a réussi à récupérer les données sans problème. J’aimerais l’équivalent de ce paramètre pour mon module Perl JSON:arse. Sinon, peut-être utiliser cette libraire Java dans mon code Perl, est-ce possible ?

    Le problème est qu’il manque des double quotes autour de valeurs alpha-numériques et que Perl prend donc cela pour des nombres. J’aimerais éviter la solution de devoir lire, utiliser une expression régulière et réécrire mon fichier.

    Exemple : ["48505294","Demo_study",{…"rawscore":999,"behavior":777,"handedness_score":999.0, "handedness":NaN,"total_score":999 …}]

    L’erreur vient de : "handedness":NaN,


    Merci,

    Jasmine.
    -- Jasmine --

  4. #4
    Rédacteur/Modérateur

    Je ne pense pas que ce soit du JSON valide, du coup le module ne sait probablement pas parser NaN ("not a number") à un endroit où, précisément, une valeur numérique ou entre guillemets est attendue.

    Je ne crois pas qu'il soit possible de demander au module d'être moins strict dans son interprétation de ce genre de cas, mais je peux me tromper car je ne suis vraiment pas un expert de ce module que je n'ai utilisé que très rarement et pour des cas très simples.

    A part hacker le code du module, je ne vois pas trop de solution autre que celle consistant à prétraiter le JSON pour remplacer NaN par quelque chose d'autre, ou ajouter des guillemets.

  5. #5
    Membre émérite
    D'accord, merci.
    -- Jasmine --

  6. #6
    Nouveau membre du Club
    Bonjour Jasmine80,

    Lolo78 à raison ce n'est pas du JSON valide, la RFC 7159 est très claire la dessus, seules les valeurs numériques (positive ou négative), peuvent ne pas être protégées.

    J'ai pris l'habitude de valider le JSON avant intégration, ici : https://jsonformatter.curiousconcept.com

    Je serai à ta place, je ferai :
    • prendre le JSON comme un fichier texte avec File::Slurp (en ARRAY ou SCALAR selon la taille)
    • passerai une regex pour transformer cette anomalie, sur chaque ligne ou tout le string, avec un truc du style :
      Code :Sélectionner tout -Visualiser dans une fenêtre à part
      s!(".*?")\s*<img src="images/smilies/icon_sad.gif" border="0" alt="" title=":(" class="inlineimg" />\s*\w(.*)([ ,"])!$1: "$2"$3!g
    • repasserai le résultat au JSON:arse.


    Pas très sûr de la RegEX, mais c'est l'esprit.

  7. #7
    Rédacteur/Modérateur

    Oui, dca_marshall ++, c'est exactement le genre de choses que j'avais en tête quand je parlais de prétraiter le JSON.