Yerel JSON dosyasını değişkene yükleyin


113

Javascript'te bir değişkene .json dosyası yüklemeye çalışıyorum, ancak çalışmasını sağlayamıyorum. Muhtemelen küçük bir hata ama bulamıyorum.

Statik verileri şöyle kullandığımda her şey yolunda gidiyor:

var json = {
  id: "whatever",
  name: "start",
  children: [{
      "id": "0.9685",
      "name": " contents:queue"
    }, {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  }]
}

{}Bir content.jsondosyadaki her şeyi koydum ve burada açıklandığı gibi yerel bir JavaScript değişkenine yüklemeye çalıştım: json'u değişkene yükleyin .

var json = (function() {
  var json = null;
  $.ajax({
    'async': false,
    'global': false,
    'url': "/content.json",
    'dataType': "json",
    'success': function(data) {
      json = data;
    }
  });
  return json;
})();

Chrome hata ayıklayıcısı koştum ve her zaman değişkeninin değeri söylüyor jsonolduğunu null. content.jsonDiyor .js dosyasıyla aynı dizinde dosya bulunduğu.

Ne kaçırdım?


1
Dosyanızın url'si, /content.jsondosyanın web uygulamanızın kök seviyesinde olduğu anlamına gelir. content.jsonKomut dosyanızın yerleştirildiği dizine işaret etmek için (eğik çizgi olmadan) olarak değiştirin . Yalnızca komut dosyanızın kök seviyesi dizinde olması durumunda çalışacaktır.
Samich

dosya WebContent \ jit \ content.json içinde bulunuyor .. 'url'yi denedim: "/WebContent/jit/content.json", ancak değişken yine de boş
PogoMips

Yanıtlar:


38

Nesnenizi content.jsondoğrudan içine yapıştırdıysanız , geçersiz JSON'dur. Değer sayısal, boole veya bileşik (dizi veya nesne) olmadığı sürece JSON anahtarları ve değerleri çift tırnak ( "değil ') içine alınmalıdır null. JSON, işlevler veya undefineddeğerler içeremez . Aşağıda, nesneniz geçerli JSON olarak verilmiştir.

{
  "id": "whatever",
  "name": "start",
  "children": [
    {
      "id": "0.9685",
      "name": " contents:queue"
    },
    {
      "id": "0.79281",
      "name": " contents:mqq_error"
    }
  ]
}

Bir de fazladan vardı }.


1
Bunun düzelttiğine inanamıyorum .. neden çift tırnak olmadan doğrudan .js dosyasına gömülü çalışıp .json dosyasında çalışmasın? Bu hiç mantıklı değil ...
PogoMips

16
@ user1695165 - json ve bir javascript nesnesi iki farklı şeydir, sadece aynı görünürler.
adeneo

2
@Kevin B "... değer sayısal [veya boole] olmadığı sürece."
Jacob Beauchamp

1
Sadece bir ipucu: json verilerinizi kullanmadan önce kontrol etmek için jsonlint.com gibi bir json doğrulayıcı kullanabilirsiniz .
Marco Panichi

129

Benim çözümüm, burada cevaplandığı gibi , kullanmaktır:

    var json = require('./data.json'); //with path

Dosya yalnızca bir kez yüklenir, diğer istekler önbellek kullanır.

düzenle Önbelleğe almayı önlemek için, modül kullanılarak yorumlarda verilen bu blog gönderisindeki yardımcı işlevi burada bulabilirsiniz fs:

var readJson = (path, cb) => {
  fs.readFile(require.resolve(path), (err, data) => {
    if (err)
      cb(err)
    else
      cb(null, JSON.parse(data))
  })
}

48
Bu çözümün RequireJS adlı ek bir kitaplık gerektirdiğini belirtmek istedim .
Luis Kabongo

4
Önbelleğe alma nasıl önlenir?
nono

2
Guilherme Oenning'e göre tavsiye edilmez goenning.net/2016/04/14/stop-reading-json-files-with-require
Sangimed

2
TLDR; önbelleğe alma, birim testlerinde ona çarptı ve bu nedenle, önbelleğe almayı önlemek için yardımcı bir işlev veriyor (ping @nono).
Ehvince

@Ehvince Oh, makalenin tamamını okumadığım için bunu fark etmedim. Teşekkürler :-)
Sangimed

50

ES6 / ES2015 için doğrudan şu şekilde içe aktarabilirsiniz :

// example.json
{
    "name": "testing"
}


// ES6/ES2015
// app.js
import * as data from './example.json';
const {name} = data;
console.log(name); // output 'testing'

Typescript kullanıyorsanız, json modülünü şu şekilde ilan edebilirsiniz:

// tying.d.ts
declare module "*.json" {
    const value: any;
    export default value;
}

Typescript 2.9+ sürümünden beri ekleyebileceğiniz - resolJsonModule compilerOptions içindetsconfig.json

{
  "compilerOptions": {
    "target": "es5",
     ...
    "resolveJsonModule": true,
     ...
  },
  ...
}

5
içe aktarma işlemi Chrome v72'de çalışmıyor - halaUncaught SyntaxError: Unexpected token *
1000Gbps

2
Bunu kullandığımda, bu databir modül gibi görünüyor ama data.defaultnesnesi
Dustin Michels

1
Bunu konsolda çalıştırmaya çalışıyordum ama başarılı olamadım. Bu, babel-node 6.26.0 ile düğüm v12.4.0 ile çalışmaz. Ben her zaman SyntaxError: Unexpected token *
anlıyorum

2
ES6 / ES2015 için doğrudan içe aktarabilirsiniz: Görünüşe göre import * as data from './example.json'bir mime tipi hatası nedeniyle yaparken bir konsol hatası alıyorum.
Fallenreaper

eğer kullanırsam import * as data from './example.json';o datazaman sadece modül, ama data.defaultnesnedir. Ama kullandığım import data from './example.json';zaman datadaha uygulanabilir olan nesnedir
Nel

4

İki olası sorun vardır:

  1. AJAX eşzamansızdır, bu nedenle jsondış işlevden döndüğünüzde tanımsız olacaktır. Dosya yüklendiğinde, geri arama işlevi jsonbir değere ayarlanacaktır , ancak o anda artık kimsenin umurunda değil.

    Bunu düzeltmeye çalıştığını görüyorum 'async': false. Bunun çalışıp çalışmadığını kontrol etmek için bu satırı koda ekleyin ve tarayıcınızın konsolunu kontrol edin:

    console.log(['json', json]);
  2. Yol yanlış olabilir. Komut dosyanızı HTML belgesine yüklemek için kullandığınız yolu kullanın. Senaryonuz Yani eğer js/script.js, kullanımjs/content.json

    Bazı tarayıcılar size hangi URL'lere erişmeye çalıştıklarını ve bunların nasıl gittiğini gösterebilir (başarı / hata kodları, HTML başlıkları, vb.). Ne olacağını görmek için tarayıcınızın geliştirme araçlarını kontrol edin.


Belki jquery versiyonu bunu henüz desteklemiyor? İfadeyi geliştirdim.
Aaron Digulla

4

Yerleşik node.js modül fs ya eşzamanlı veya eşzamansız ihtiyaçlarınıza bağlı yapacaktır.

Kullanarak yükleyebilirsiniz var fs = require('fs');

Eşzamansız

fs.readFile('./content.json', (err, data) => {
    if (err)
      console.log(err);
    else {
      var json = JSON.parse(data);
    //your code using json object
    }
})

Senkron

var json = JSON.parse(fs.readFileSync('./content.json').toString());

-1

~ / My-app / src / db / abc.json dosyasındaki gibi verilen json biçimi için:

  [
      {
        "name":"Ankit",
        "id":1
      },
      {
        "name":"Aditi",
        "id":2
      },
      {
        "name":"Avani",
        "id":3
      }
  ]

~ / my-app / src / app.js gibi .js dosyasına içe aktarmak için inorder:

 const json = require("./db/abc.json");

 class Arena extends React.Component{
   render(){
     return(
       json.map((user)=>
        {
          return(
            <div>{user.name}</div>
          )
        }
       )
      }
    );
   }
 }

 export default Arena;

Çıktı:

Ankit Aditi Avani

Bu, burada sorulmayan bir sorunun cevabıdır.
Kevin B

@KevinB açıklamama göre .json dosyasını .js dosyasına aktardım. Bu, json dosyasını const json'a yüklememe yardımcı oldu. Buradan, kullanıcı öznitelikleri için aşağıdaki json sözlüğünü kullanabilirim.
Ank_247shbm

Bu harika, ancak bu soru, bir nesnenin değişmez değerini bir .json dosyasına kopyalamaya çalışan ve daha sonra ajax ile yükleyen bir kullanıcı hakkındadır, yalnızca nesne değişmez değerleri JSON için geçerli olmayan bir biçimdedir. React'i kurarken ve bunu gerektirirken içe aktarmak bazı durumlarda kesinlikle işe yarayacak olsa da, bu durumda gerçekten yardımcı olmuyor .
Kevin B

Bir not olarak: Diğer tüm yanıtlarda bu yanıta bağlantı veren yorumlar yayınlamak, aşırı kişisel tanıtım olarak kabul edilebilir ve yanıtları düzenlemeye çalışmak vandalizmdir. Yorumlarınız kaldırıldı ve lütfen bir daha böyle düzenlemeler yapmayın.
Brad Larson
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.