public static TableIdentifier fromJson(String json) {
    Preconditions.checkArgument(
        json != null, "Cannot parse table identifier from invalid JSON: null");
    Preconditions.checkArgument(
        !json.isEmpty(), "Cannot parse table identifier from invalid JSON: ''");
    return JsonUtil.parse(json, TableIdentifierParser::fromJson);
  }
@Test
  public void testTableIdentifierFromJson() {
    String json = "{\"namespace\":[\"accounting\",\"tax\"],\"name\":\"paid\"}";
    TableIdentifier identifier = TableIdentifier.of(Namespace.of("accounting", "tax"), "paid");
    assertThat(TableIdentifierParser.fromJson(json))
        .as("Should be able to deserialize a valid table identifier")
        .isEqualTo(identifier);

    TableIdentifier identifierWithEmptyNamespace = TableIdentifier.of(Namespace.empty(), "paid");
    String jsonWithEmptyNamespace = "{\"namespace\":[],\"name\":\"paid\"}";
    assertThat(TableIdentifierParser.fromJson(jsonWithEmptyNamespace))
        .as("Should be able to deserialize a valid multi-level table identifier")
        .isEqualTo(identifierWithEmptyNamespace);

    String identifierMissingNamespace = "{\"name\":\"paid\"}";
    assertThat(TableIdentifierParser.fromJson(identifierMissingNamespace))
        .as(
            "Should implicitly convert a missing namespace into the the empty namespace when parsing")
        .isEqualTo(identifierWithEmptyNamespace);
  }