danielgtaylor / danielgtaylor/python-betterproto

Incorrect JSON serialization of repeated int64

Ouverte
#677 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

bug investigation needed
Langage dominant
Python
Étoiles
1.8k
Forks
234
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

Summary

When I create a contract with a repeated int64 variable, it serializes into repeated string, which is an unpredictable behaviour

Reproduction Steps
  1. Create a contract:
// ExampleContract describes example of contract.
message ExampleContract {
  // List of int64.
  repeated int64 items = 1;
  // Default int64 value.
  google.protobuf.Int64Value default = 2;
}
  1. Compile to python:
@dataclass(eq=False, repr=False)
class ExampleContract(betterproto.Message):
    """
    ExampleContract describes example of contract.
    """

    items: List[int] = betterproto.int64_field(1)
    """List of int64."""

    default: Optional[int] = betterproto.message_field(2, wraps=betterproto.TYPE_INT64)
    """Default int64 value."""
  1. Create instance of class and serialize it to JSON:
ec = ExampleContract(items=[5, 10], default=10)

print(ec.to_json())
Expected Results

{"items": [5, 10], "default": 10}

Actual Results

{"items": ["5", "10"], "default": 10}

System Information

libprotoc 25.3, Python 3.12.7

Name: betterproto
Version: 2.0.0b7
Summary: A better Protobuf / gRPC generator & library
Home-page: https://github.com/danielgtaylor/python-betterproto
Author: Daniel G. Taylor
Author-email: danielgtaylor@gmail.com
License: MIT
Location: /opt/conda/lib/python3.12/site-packages
Requires: grpclib, python-dateutil, typing-extensions

Checklist
  • I have searched the issues for duplicates.
  • I have shown the entire traceback, if possible.
  • I have verified this issue occurs on the latest prelease of betterproto which can be installed using pip install -U --pre betterproto, if possible.

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par reproduire le problème avec le ExampleContract généré et son appel à to_json(), en comparant les éléments int64 répétés avec le champ par défaut enveloppé. Suivez le chemin de sérialisation JSON utilisé par le message Python généré. Le travail est terminé lorsque les valeurs int64 répétées sont sérialisées en tant que valeurs JSON numériques, conformément à la sortie attendue, sans modifier le comportement du champ enveloppé.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
api
Type d'issue
Bug
Difficulté
3/5
Temps estimé
1-2 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.