Как мне загрузить и использовать статический файл JSON с помощью CoffeeScript?

#javascript #json #coffeescript

#javascript #json #coffeescript

Вопрос:

Я получил несколько советов по использованию «requirejs», но у меня возникли проблемы с его работой. Я новичок в CoffeeScript, а также новичок в JavaScript.

Мой JSON-файл (или, точнее, js-файл, содержащий строку JSON) выглядит следующим образом:

 define(function(require)
{
  return 
  {
    "name": "Joe",
    "age": 30
  }
});
  

В моем app.coffee есть:

 requirejs.config
  paths:
    text: "<path to requirejs-text>"
    json_path: "<path to json file>"
  

Мой main.coffee имеет:

 define(require) ->
  ko = require 'knockout'
  $ = require 'jquery'
  jsonObj = require 'json_path'

  class Main_App
    constructor ->
      @age = ko.observable jsonObj.age
  

Я получаю следующую ошибку в моем сгенерированном JavaScript:

Неперехваченная ошибка синтаксиса: неожиданный токен :

Он жалуется на двоеточие в строке:

«имя»: «Джо»,

Кажется очевидным, что оболочка javascript вокруг моей строки JSON не структурирована должным образом. Я хотел напрямую прочитать файл «data.json», но он искал файл «.js». Мне сказали, что мне нужно обернуть строку JSON в javascript «define (function (require)», но, похоже, я не могу найти справку о том, как ее отформатировать. Кто-нибудь может меня отклеить? Спасибо!

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

1. Согласно JSON Lint, встроенная строка JSON является допустимой. Проблема, похоже, заключается в «оболочке функций javascript», которая должна работать с requirejs. Мне было поручено сделать так, чтобы он выглядел таким образом, чтобы он «возвращал» строку JSON.

2. Есть ли лучший способ заставить CoffeeScript читать «необработанный JSON» файл, который не заключен в код javascript?

Ответ №1:

Автоматическая вставка точки с запятой в JavaScript, похоже, здесь виновата.

Когда вы пишете

 define(function(require)
{
  return // a ; is added here. 
  {
    "name": "Joe",
    "age": 30
  }
});
  

Точка с запятой добавляется за вашей спиной после оператора return, поэтому функция возвращает undefined вместо вашего объекта.

Попробуйте вместо этого так :

 define(function(require)
{
  return {
    "name": "Joe",
    "age": 30
  };
});
  

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

1. Ой! Большое спасибо. Я думал, что JavaScript не зависит от пробелов. Я не понимал, что он обрабатывает разрывы строк как неявные точки с запятой.