Skip to content

(De)serializer from/to JSON #518

@Kriskras99

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).

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions