我正在尝试使用强制代码从JSON文件中读取数据:
void makeRequest(Event e){
var path='json/config.json';
var httpRequest= new HttpRequest();
httpRequest
..open('GET', path)
..onLoadEnd.listen((e)=>requestComplete(httpRequest))
..send('');
}
当应用程序以http:// ... / index.html运行时,这非常有效,但在尝试将其打开为file:///.../index.html
Exception: NetworkError: Failed to load 'file:///D:/DartApp/web/json/config.json'. main.dart:53makeRequest main.dart:53<anonymous closure>
除了httpRequest之外还有其他方法可以从客户端读取JSON文件!
我知道我有3个选项,其中2个只能使用HttPRequest,它们是:
我正在寻找第三种选择的方法,就像使用webview制作离线Android应用程序,或者制作离线Chrome打包应用程序,即我根本不想使用服务器。感谢
感谢
答案 0 :(得分:7)
如果您需要的只是json文件中的数据,您只需将这些数据包含在.dart
文件中(例如,作为Map
变量/常量)。
Map config = {
"displayName": "My Display Name",
"anotherProperty": 42,
"complexProperty": {
"value_1": "actual value",
"value_2": "another value"
}
};
如果您需要实际的json,可以输入String
。类似的东西:
const configJson = '''
{ "displayName": "My Display Name",
"anotherProperty": 42,
"complexProperty": {
"value_1": "actual value",
"value_2": "another value"
}
}
''';
json数据可以位于单独的.dart
文件中,该文件可以作为同一个库的一部分(通过part of ...
)或导入(import 'package:mypackage/json.dart';
)包含在内。
如果您正在寻找可以更改并且更改仍然存在的内容,那么您将需要使用某种离线存储,如果您正在运行,则可以使用网络存储在浏览器中。您可以使用上述方法定义初始配置数据,将其存储在Web存储中,然后从那里读取并编辑它。
[编辑原始问题之前的上一个答案。]
对不起,请阅读&#34;客户端&#34;,思考&#34;服务器端&#34;。我的错误。
如果是&#34;客户端&#34;你的意思是&#34;在浏览器中运行&#34;,你试图访问服务器上的json文件,然后不,除了http请求之外没有任何其他方式。实际上,这是在服务器上读取任何文件的唯一方法,而不仅仅是json文件。 (好吧,我想你可以打开一个WebSocket并传输内容,但这似乎不是你正在寻找的解决方案。)
[下面的旧解决方案,在我的错误(服务器与客户端)之前指出。]
尝试:
// THIS DOESN'T WORK IN A BROWSER ENVIRONMENT (aka client side)
import 'dart:io';
import 'dart:convert';
// ...
new File('json/config.json')
.readAsString()
.then((fileContents) => JSON.decode(fileContents))
.then((jsonData) {
// do whatever you want with the data
});
答案 1 :(得分:2)
这个糟糕的例子在chrome dev编辑器dart web app示例中运行良好。 使用 HttpRequest.getString 可以正常使用文件名和路径。
克里斯在json网络服务方面做得很好 https://www.dartlang.org/articles/json-web-service/
import 'dart:html';
import 'dart:convert';
void main() {
HttpRequest.getString('json/config.json').then((myjson) {
Map data = JSON.decode(myjson);
var version = data["version"];
var element = new DivElement();
element.text = "version = $version";
document.body.children.add(element);
});
}