Working with other API specs

Avro Integration

Overview

Taxi can enhance Apache Avro schemas with semantic meaning, enabling:

  • Semantic typing for Avro records and fields
  • Type-safe data serialization and deserialization
  • Integration with Avro-based messaging systems

Semantic Enhancement

While Avro describes data structure and serialization, Taxi adds semantic meaning to enable better data discovery and integration across systems.

Adding Taxi to Avro

Schema Annotation

Add semantic types to Avro using the taxi.dataType attribute:

{
  "type": "record",
  "namespace": "customer",
  "name": "CustomerRecord",
  "taxi.dataType": "acme.Customer",
  "fields": [
    {
      "name": "id",
      "type": "string",
      "taxi.dataType": "acme.CustomerId"
    },
    {
      "name": "email",
      "type": "string",
      "taxi.dataType": "acme.EmailAddress"
    }
  ]
}

Auto-Type Generation

If no taxi.dataType is specified, Taxi will generate types based on:

  • For records: The combination of namespace and name
  • For fields: The field name and underlying primitive type

Declaring Avro in Taxi

You can also describe your Avro model directly in Taxi.

Reccomendation: Add taxi types to Avro schemas when possible

You can generate these Avro models by hand - but we don't recommend it.

If you have an Avro schema and can annotate it, it's recommended to annotate that with taxi types, rather than duplicating the schema definition as a Taxi model.

Basic Model Definition

import lang.taxi.formats.AvroMessage
import lang.taxi.formats.AvroField

@AvroMessage
model Customer {
   @AvroField(ordinal = 0) 
   id: CustomerId
   
   @AvroField(ordinal = 1) 
   email: EmailAddress?
   
   @AvroField(ordinal = 2) 
   addresses: Address[]
}

Field Ordering

Avro serialization depends on field order. Always specify ordinals using @AvroField to ensure consistent serialization.

Type Mapping

Taxi automatically maps Avro types to appropriate semantic types:

@AvroMessage
model Order {
   // Maps string to semantic type
   @AvroField(ordinal = 0) 
   orderId: OrderId inherits String
   
   // Maps int to semantic type
   @AvroField(ordinal = 1) 
   quantity: Quantity inherits Int
   
   // Maps array to semantic type array
   @AvroField(ordinal = 2) 
   items: OrderItem[]
}
Previous
Open API
Next
Protobuf