Skip to content

(De)serializer from/to JSON #518

Description

@Kriskras99

Original issue #449 by @PookieBuns

Currently we only support (de)serializing from/to JSON via the TryFrom<serde_json::Value> for avro::types::Value and TryFrom<avro::types::Value> for serde_json::Value implementations.
These implementations are not according to the spec:

#[test]
fn avro_rs_518_union_int_is_json_int_value() {
    let v = Value::Union(1, Box::new(Value::Int(42)));
    let json: JsonValue = v.try_into().unwrap();
    assert_eq!(json, json!({"int": 42}));
}
#[test]
fn avro_rs_518_union_enum_is_json_enum_name_value() {
    let v = Value::Union(1, Box::new(Value::Enum(5, "Problematic")));
    let json: JsonValue = v.try_into().unwrap();
    // The Value::Enum doesn't contain the enum name (some_name) so can't do the correct thing
    assert_eq!(json, json!({"some_name": "Problematic"}));
}

Both these tests will fail. The first test can be fixed using the TryFrom implementations, but the second test cannot be fixed as avro::types::Value does not contain the necessary information for named types.

If we decide to support the JSON encoding of Avro, I suggest the following:

  1. Create a new module json that will contain the from_reader(reader, schema)/to_writer(writer, schema, value).
  2. Create a new serializer and deserializer that wrap around serde_json's serializer and deserializer, using the schema to call the right functions on serde_json's serializer and deserializer.
  • The alternative is (de)serializing to serde_json::Value first, and then implementing our serializer and deserializer around that. However, this is really slow.
  • If there is a usecase for (de)serializing to serde_json::Value, support can always be added later with a to_value/from_value function (it can reuse the logic of SchemaAwareRecordFieldDefault for the serialisation part).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions