Retrieve Json data and create multiple pages with it

Yes it is possible to loop through the json and create a page for each hero entry. This will create a new page for each (adds the name as the title and the bio in the content area). You could create your own custom post type if you want, this would make it easier for customisation. https://codex.wordpress.org/Post_Types

jQuery

$(document).ready(function(){

    //Get Jason Data- this is for a local file
    $.getJSON('/hero.json',function(data) {
       // the action name refers to the php wp_ajax_ action
        $.post('/wp-admin/admin-ajax.php',{data:data,action:"add_pages"}, function(response) {
            //Check teh Ajax Response
            console.log('Got this from the server: ' + response);
        });
    });

});

Function.php

function add_pages_function() {

    global $wpdb; 
    // this is how you get access to the database
    $data = $_POST['data']; 
    //loop through json
    foreach($data as $d){

    echo $d['name'];
    //Add pages
    $post["id"] = wp_insert_post( array(
            "post_title" => $d['name'],
            "post_author" => 1,
            "post_content" => $d['bio'],
            "post_type" => 'page',   //or add 'custom_post_type' slug
            "post_status" => "publish"
        )); 
    //UPDATED - for adding meta data (linked custom fields)
    update_post_meta( $post["id"],'my-custom-meta' , $d['super power'] );
    }
    wp_die();
}
//  uses 'add_pages' from the action after the wp_ajax
add_action( 'wp_ajax_add_pages', 'add_pages_function' );

For more wp_inerst_post options https://developer.wordpress.org/reference/functions/wp_insert_post/

This has no checks in for checking if that post title exists but it should be a good start