Two languages, one shape

What is null for which language and why. A client renders both with one component because the fields are the same.

By field

FieldEnglish entryJapanese entry
pronunciations[].ipa"wɔk"null
pronunciations[].readingnull"たべる", kana
pronunciations[].accentnull2: the pitch drops after the second mora. 0 is heiban, no drop.
pronunciations[].dialect"AmE"null
sounds[].alphabet"ipa""phonetic"
inflections[].tonenull"plain" or "polite", null on forms with no distinction
inflections[].polaritynull on all but a few negative forms"positive" or "negative"
inflections[].pronunciations[] on most formsone row with the form's reading
inflections[].form"past tense", English"過去形", Japanese, with form_translations.eng
senses[].translationskeyed "jpn", glosses carry readingskeyed "eng", readings empty
senses[].pos"verb""動詞", with pos_translations.eng
spellingsusually []other written forms, labelled

Why null and not missing

A client written against a Japanese entry parses an English one unchanged, and the reverse. Nothing is conditional on the language except what to show, and the entry says what to show by which fields are filled. It is also what makes the additive promise cheap to keep: the shape never forks by language.

Two samples

eng · walk · abridged
{
  "id": "99680fd6-177c-4eda-bedc-5680c8412d2c",
  "headword": "walk",
  "lang": "eng",
  "frequency_rank": 1866,
  "pronunciations": [
    {
      "ipa": "wɔk",
      "dialect": "AmE",
      "reading": null,
      "accent": null,
      "sounds": [
        {
          "mp3_url": "https://storage.immit.co/sounds/01JW8HJT7W37QETQKNHBDJ36NJ.mp3",
          "voice": "Emma",
          "gender": "female",
          "alphabet": "ipa"
        },
        // … 1 more voice
      ]
    }
  ],
  "senses": [
    {
      "pos": "verb",
      "pos_translations": {
        "jpn": "動詞"
      },
      "definition": "to move along on foot by putting one foot in front of the other, not running",
      "translations": {
        "jpn": {
          "qualifier": null,
          "glosses": [
            {
              "text": "歩く",
              "readings": [
                "あるく"
              ]
            },
            {
              "text": "歩いて行く",
              "readings": []
            }
          ]
        }
      },
      // … examples, ids
    },
    // … 6 more senses
  ],
  "inflections": [
    {
      "text": "walked",
      "form": "past tense",
      "form_translations": {
        "jpn": "過去形"
      },
      "tone": null,
      "polarity": null,
      "pronunciations": []
    },
    // … 4 more rows
  ],
  "spellings": [],
  // … relations, updated_at
}
jpn · 食べる · abridged
{
  "id": "9bebf0ab-36ee-4511-a271-f8d0a21efe31",
  "headword": "食べる",
  "lang": "jpn",
  "frequency_rank": 293,
  "pronunciations": [
    {
      "ipa": null,
      "dialect": null,
      "reading": "たべる",
      "accent": 2,
      "sounds": [
        {
          "mp3_url": "https://storage.immit.co/sounds/01M45PR236JEQ21RS26407FZ32.mp3",
          "voice": "Himari",
          "gender": "female",
          "alphabet": "phonetic"
        }
      ]
    }
  ],
  "senses": [
    {
      "pos": "動詞",
      "pos_translations": {
        "eng": "verb"
      },
      "definition": "食物を口に入れ、かんで飲み込む。",
      "translations": {
        "eng": {
          "qualifier": null,
          "glosses": [
            {
              "text": "to eat",
              "readings": []
            },
            {
              "text": "to have (a meal)",
              "readings": []
            }
          ]
        }
      },
      // … examples, ids
    },
    // … 1 more sense
  ],
  "inflections": [
    {
      "text": "食べる",
      "form": "現在形",
      "form_translations": {
        "eng": "present"
      },
      "tone": "plain",
      "polarity": "positive",
      "pronunciations": [
        {
          "reading": "たべる",
          // …
        }
      ]
    },
    // … 42 more rows
  ],
  "spellings": [
    {
      "text": "喰べる",
      "label": "まれな漢字",
      // …
    }
  ],
  // … relations, updated_at
}