Javascript — загрузка json из переменной

#javascript #json

#javascript #json

Вопрос:

metaModelSrc: «myfile.json» — отлично работает, но мне нужна переменная, вместо того, чтобы получать API — объект json. это означает, что вы можете сделать metaData.name и он это покажет

  • когда вы копируете вставляете stringify в файл json и указываете путь к файлу, он работает. когда вы загружаете большой двоичный объект и указываете его как файл пути.json он работает — мне нужно загрузить его из кода, не загружая большой двоичный объект

Моя ошибка: metaModelSrc

 Failed to load model metadata for model 'fsfdsfsdfs from  'application/json' - utils.loadJSON(): Failed to parse JSON response - SyntaxError: Unexpected token < in JSON at position 0
  

Я пытался выполнить stringify, и это не сработало, я попытался превратить его в файл, и это не сработало.

  • Я загрузил его из большого двоичного объекта и дал ему путь metaModelSrc: «…./myfile.json», и это сработало. но мне нужно загрузить это из переменной, а не из пути, и мне не интересно загружать большой двоичный объект, мне нужно работать с данными, которые я получаю из api.
 // metaData - json object from api
const metaDatastringify= JSON.stringify(metaData);
var file = new Blob([metaDatastringify], {type: 'application/json'});
var file1 = new File([file], "name", {type: 'application/json'});

    gltfLoader.load({
      id: "fsfdsfsdfs",
      metaModelSrc: file1,
      edges: true,
      performance: true,
    });
  

Комментарии:

1. что ты снова пытаешься сделать?

2. Эта ошибка, скорее всего, означает metaData , что это XML или HTML и не может быть проанализирована JSON API.

3. metaModelSrc = «myfile.json» ! он отлично работает! но мне нужен myfile. json как переменная вместо пути типа «,,,,/myfile.json»

4. покажите нам метаданные, они начинаются с < , так что это недопустимый json

5. но это не так, все начинается с < , может быть, вы получаете какую-то синтаксическую ошибку из api? проверьте в инструментах разработчика браузера, что именно вы получаете в ответ от api

Ответ №1:

 const urlTestJsonModel = URL.createObjectURL(file);
  

metaModelSrc: urlTestJsonModel
Решена моя проблема 🙂 Спасибо всем за вашу помощь

Ответ №2:

Сообщение об ошибке `Неожиданный токен < в JSON в позиции 0` всегда означает определенный тип ошибки

Сначала я подумал, что это JSON.stringify , но, конечно, это неправильно. Мы ошибаемся, обращая внимание на следующую строку:

 const metaDatastringify= JSON.stringify(metaData);
  

… и, следовательно, от содержимого метаданных.

Это не строка, которая подвержена ошибкам. Вы можете JSON.stringify практически любую старую ерунду.

Ваша ошибка в JSON.parse

При этом возникает ошибка (но в самом этом коде ошибки нет):

 gltfLoader.load({
  id: "fsfdsfsdfs",
  metaModelSrc: file1,
  edges: true,
  performance: true,
});
  

JSON.parse всегда ожидает получения строки, первым символом, не содержащим пробелов, является «{«.

Ваш вызов JSON.parse находится не в вашем коде, а в коде gltfLoader.load() .

Примеры проблем, которые вы можете получить с помощью JSON.parse:

 // Correct call
JSON.parse('{"a":3, "b":"hello"}')
{a: 3, b: "hello"}

// Forget the quotation marks around "a"
JSON.parse(' {a:"<html>skdjfhskdf</html> "}')
Uncaught SyntaxError: Unexpected token a in JSON at position 2

// Use wrong quotation marks (JSON.parse insists on double-quotes for each key. (I have put this error message as two single quotes, to stop stack overflow turning everything that follows into a comment, but it will appear as only one single quote.)
JSON.parse(" {'a':'<html>skdjfhskdf</html> '}")
Uncaught SyntaxError: Unexpected token '' in JSON at position 2

// Empty string input
JSON.parse("")
Uncaught SyntaxError: Unexpected end of JSON input

// Undefined - watch out for this one which is completely baffling the first time it happens! I think it is converting undefined into "undefined" for some reason?
JSON.parse(undefined)
Uncaught SyntaxError: Unexpected token u in JSON at position 0

// Feed in an HTML or XML string, i.e. something starting with an "<"
JSON.parse("<html>Hello</html>")
Uncaught SyntaxError: Unexpected token < in JSON at position 0
  

Шаги для диагностики

Это последний тип, который вы получаете. Поэтому во время выполнения gltfloader.load() оператор JSON.parse каким-то образом получает элемент данных в формате XML или HTML.

Либо сервер действительно отправляет данные в этом формате, либо он отправляет сообщение об ошибке, например, страницу 404.

Есть ли у вас какой-либо способ чтения этой страницы через javascript в любом другом формате, кроме via gltfloader ?

Рассматривали ли вы возможность чтения его так, как если бы это был текстовый файл (с помощью javascript, а не с помощью ручного маршрута и сохранения), и посмотрите, что вы получите?

Это ожидаемая строка JSON или что-то еще? Держу пари, что это последнее.

В частности, мы видим, что сообщение об ошибке не из Javascript, а из кода, написанного вашим или введенного вами

Не удалось загрузить метаданные модели для модели ‘fsfdsfsdfs из ‘application / json’ — utils.loadJSON(): не удалось проанализировать ответ JSON — Ошибка синтаксиса: неожиданный токен < в JSON в позиции 0

Разбейте его следующим образом.

Эта последняя часть выдается Javascript:

 utils.loadJSON(): Failed to parse JSON response - SyntaxError: Unexpected token < in JSON at position 0
  

Эта предыдущая часть намеренно выдается кодом, который не является интерпретатором Javascript.

 Failed to load model metadata for model 'fsfdsfsdfs from  'application/json' 
  

Кто-то закодировал эту фразу «Не удалось загрузить метаданные модели для модели». Этого не существует в интерпретаторе Javascript. Это в каком-то модуле кода, который был добавлен. Появляется сообщение об ошибке, которое намеренно печатает это, а затем показывает базовое сообщение об ошибке Javascript.

Суть проблемы заключается в файле JSON.parse (не JSON.stringify), который работает со строкой XML или HTML, а не со строкой JSON.

Вы уверены, что функция Javascript new File действительно создает файл и сохраняет его в вашей файловой системе?

Вы говорите нам, что когда вы вводите "myfile.json" в metaModelSrc, код работает. Это означает, что код работает правильно, когда он считывает файл из файловой системы компьютера (т. Е. Файл, Который вы можете увидеть в проводнике, Finder или Nautilus и т. Д.).

Тем не менее, я думаю, что функция javascript «новый файл» на самом деле не сохраняет файл на жесткий диск вашего компьютера, не так ли? Можете ли вы посмотреть, создается ли он при его запуске?

Комментарии:

1. JSON.parse(metaDatastringify) — я возвращаю свой объект json, но metaModelSrc завершится сбоем объекта, и это метаданные, которые я получаю от api в конце

2. Не та строка. Проблема в последней строке вашего кода

3. это тот же файл json

4. Да, я уверен. потому что, когда я загружаю файл и использую его в своем path, он работает

5. const urlTestJsonModel = URL.createObjectURL(file); metaModelSrc: urlTestJsonModel решил мою проблему 🙂 Спасибо всем за вашу помощь