Ответ преобразования XMLHttpRequest в JSON с javascrip, но объект является нулевым - PullRequest
0 голосов
/ 21 сентября 2019

Я являюсь зеленым рогом с Javascript, теперь у меня есть проблема, как, когда нужно преобразовать ответ от объекта XMLHttpRequest в объект javascript с JSON.parse(response)

Так что моя проблема

Я загружаю файл в мой локальный каталог, nameProject/app/resources/ с XMLHttpRequest с этим кодом

код для создания запроса

function readResourcesFile(pathFile, callback) {
  let confFile = new XMLHttpRequest();
  confFile.open('GET', pathFile, true);
  confFile.setRequestHeader('Content-Type', 'application/json');
  let configuration;
  confFile.onreadystatechange = function(){
    if (confFile.readyState === 4) {  // document is ready to parse.
      if (confFile.status === 200) {  // file is found
        let response = confFile.responseText;
        callback(response);
      }
    }
  };
  confFile.send(null);
}

Мой последний запрос

function readAllBenchmark() {
  readResourcesFile(rootPath + 'conf/benchmark-conf.json', function (configuration) {
    let objectConf = JSON.parse(configuration);
    console.debug('Configuration object');
    console.debug(objectConf);
    let files = objectConf.files;
    for(let i = 0; i < files.length; i++){
      console.debug('Road this file: ' + files[i]);
      readResourcesFile(rootPath + 'benchmark/' + files[i].toString(), function (fileBenchmark) {
        console.debug('File benchmark: \n' + files[i] + ' with data\n' + fileBenchmark);
        let objectBenchmark = JSON.parse(fileBenchmark);
        console.log('The object benchmark' + objectBenchmark);
        let newData = {
          label: files[i].split('.')[0],
          data: [
            convertNenosecondToSecond(objectBenchmark.benchmarks[0]), convertNenosecondToSecond(objectBenchmark.benchmarks[1])
          ],
          backgroundColor: [
            'rgba(54, 162, 235, 0.2)',
            'rgba(54, 162, 235, 0.2)',
          ],
          borderColor: [
            'rgba(54, 162, 235, 1)',
            'rgba(54, 162, 235, 1)',
          ],
          borderWidth: 2
        };
        addDataToChart(chartBenchmark, ['JSON', 'GraphTx'], newData);
      });
    }
  });
}

Мой журнал консоли

Configuration object
Object
Road this file: i5-6300U@4x_3GH_gcc7.4.0.json
Road this file: i7-4790@8x4GHz-gcc-7.4.0.json

File benchmark: 
i7-4790@8x4GHz-gcc-7.4.0.json with data
{
  "context": {
    "date": "2019-09-20 20:23:27",
    "host_name": "vincenzo",
    "executable": "./SpyCBlock-benchmarck",
    "num_cpus": 4,
    "mhz_per_cpu": 3000,
    "cpu_scaling_enabled": true,
    "caches": [
      {
        "type": "Data",
        "level": 1,
        "size": 32000000,
        "num_sharing": 2
      },
      {
        "type": "Instruction",
        "level": 1,
        "size": 32000000,
        "num_sharing": 2
      },
      {
        "type": "Unified",
        "level": 2,
        "size": 256000000,
        "num_sharing": 2
      },
      {
        "type": "Unified",
        "level": 3,
        "size": 3072000000,
        "num_sharing": 4
      }
    ],
    "load_avg": [2.01,1.67,1.8],
    "library_build_type": "debug"
  },
  "benchmarks": [
    {
      "name": "BM_createGraphTxOneFile/8",
      "run_name": "BM_createGraphTxOneFile/8",
      "run_type": "iteration",
      "repetitions": 0,
      "repetition_index": 0,
      "threads": 1,
      "iterations": 1,
      "real_time": 1.5634459013000015e+11,
      "cpu_time": 1.5495989063700000e+11,
      "time_unit": "ns"
    },
    {
      "name": "BM_decodeJsonOneFile/8",
      "run_name": "BM_decodeJsonOneFile/8",
      "run_type": "iteration",
      "repetitions": 0,
      "repetition_index": 0,
      "threads": 1,
      "iterations": 1,
      "real_time": 1.9378052880600446e+11,
      "cpu_time": 1.8018651470500000e+11,
      "time_unit": "ns"
    }
  ]
}

The object benchmark[object Object]

почему, если запустить этот код, мой код работает

console.debug('File benchmark: \n' + files[i] + ' with data\n' + fileBenchmark);

, а с этим нет?

let objectBenchmark = JSON.parse(fileBenchmark);

Обновите код и используйте fetch object

function readResourcesFileFetch(pathFile) {
    return fetch(pathFile, {
      method: 'GET', // *GET, POST, PUT, DELETE, etc.
      cache: 'no-cache', // *default, no-cache, reload, force-cache, only-if-cached
      headers: {
        'Content-Type': 'application/json',
        // 'Content-Type': 'application/x-www-form-urlencoded',
      },
      referrer: 'no-referrer', // no-referrer, *client
     // body: JSON.stringify(data), // body data type must match "Content-Type" header
    })
      .then(response => response.json()); // parses JSON response into native JavaScript objects
}


function readAllBenchmarkFetch() {
  let configuration = readResourcesFileFetch(rootPath + 'conf/benchmark-conf.json');
  configuration.then(function (confFile) {
    console.log(confFile);
    let files = confFile.files;
    for(let i = 0; i < files.length; i++){
      console.debug('Road this file: ' + files[i]);
      let singleBenchmark = readResourcesFileFetch(rootPath + 'benchmark/' + files[i].toString());
      singleBenchmark.then(function (fileBenchmark) {
        console.debug('File benchmark: \n' + files[i] + ' with data\n' + fileBenchmark.toString());
        let newData = {
          label: files[i].split('.')[0],
          data: [
            convertNenosecondToSecond(fileBenchmark.benchmarks[0]), convertNenosecondToSecond(fileBenchmark.benchmarks[1])
          ],
          backgroundColor: [
            'rgba(54, 162, 235, 0.2)',
            'rgba(54, 162, 235, 0.2)',
          ],
          borderColor: [
            'rgba(54, 162, 235, 1)',
            'rgba(54, 162, 235, 1)',
          ],
          borderWidth: 2
        };
        addDataToChart(chartBenchmark, ['JSON', 'GraphTx'], newData);
      });
    }
  })
}

1 Ответ

1 голос
/ 21 сентября 2019

Когда вы пишете console.log(someobject), браузеры умны, и имейте в виду, что вы регистрировали объект, и, таким образом, вы увидите объект в консоли.
Когда вы пишете console.log("Object is "+someobject), механизм JavaScript преобразует объект в строку и добавляет результат после текста Object is.И при строковом расположении объекта по умолчанию [object Object].
Одна попытка обходного пути, которую вы можете сделать, - использовать , вместо +, в результате чего два журнала рядом друг с другом:

var someobject={};
console.log(someobject);
console.log("Someobject is "+someobject);
console.log("Someobject:", someobject);

(При запуске сниппета вы уже что-то увидите здесь, но вы также можете открыть консоль браузера)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...