public static Set<AclEntry> fromBytes(byte[] bytes) throws IOException {
        if (bytes == null || bytes.length == 0)
            return Collections.emptySet();

        Optional<JsonValue> jsonValue = Json.parseBytes(bytes);
        if (!jsonValue.isPresent())
            return Collections.emptySet();

        JsonObject js = jsonValue.get().asJsonObject();

        //the acl json version.
        Utils.require(js.apply(VERSION_KEY).to(INT) == CURRENT_VERSION);

        Set<AclEntry> res = new HashSet<>();

        Iterator<JsonValue> aclsIter = js.apply(ACLS_KEY).asJsonArray().iterator();
        while (aclsIter.hasNext()) {
            JsonObject itemJs = aclsIter.next().asJsonObject();
            KafkaPrincipal principal = SecurityUtils.parseKafkaPrincipal(itemJs.apply(PRINCIPAL_KEY).to(STRING));
            AclPermissionType permissionType = SecurityUtils.permissionType(itemJs.apply(PERMISSION_TYPE_KEY).to(STRING));
            String host = itemJs.apply(HOSTS_KEY).to(STRING);
            AclOperation operation = SecurityUtils.operation(itemJs.apply(OPERATION_KEY).to(STRING));

            res.add(new AclEntry(new AccessControlEntry(principal.toString(),
                host, operation, permissionType)));
        }

        return res;
    }
Parse JSON representation of ACLs
@param bytes of acls json string

<p>
        {
            "version": 1,
            "acls": [
                {
                    "host":"host1",
                    "permissionType": "Deny",
                    "operation": "Read",
                    "principal": "User:alice"
                }
            ]
        }
</p>

@return set of AclEntry objects from the JSON string
server/src/main/java/org/apache/kafka/security/authorizer/AclEntry.java