最近很多小伙伴都在问nodejs-解析块状Twitterjson和node.js解析json这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Flutter使用json_model解
最近很多小伙伴都在问nodejs-解析块状Twitter json和node.js解析json这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Flutter 使用 json_model 解析 json 生成 dart 文件、linux中安装nodejs,卸载nodejs,更新nodejs,git、Node.js Twitter客户端、node.js – MongoDB nodejs:如何查询ISODate字段?等相关知识,下面开始了哦!
本文目录一览:- nodejs-解析块状Twitter json(node.js解析json)
- Flutter 使用 json_model 解析 json 生成 dart 文件
- linux中安装nodejs,卸载nodejs,更新nodejs,git
- Node.js Twitter客户端
- node.js – MongoDB nodejs:如何查询ISODate字段?
nodejs-解析块状Twitter json(node.js解析json)
nodejs服务器从Twitter“获取”此JSON流并将其发送到客户端:
stream.twitter.com/1/statuses/filter.json?track=gadget
返回给客户端的数据是“块状” JSON,并且客户端上的JSON.parse(chunk)和eval(’(’+ chunk
+’)’)都会导致解析错误。连接被卡住的部分并等待“结束”事件也不是解决方案
我注意到以前的示例在客户端上使用了类似的东西,这些东西以前似乎很有效:
socket.onmessage = function(chunk) { data = eval("(" + chunk.data + ")"); alert(data.user.screen_name);
我在客户端使用它,它导致解析错误:
var socket = new io.Socket(); socket.on(''message'', function(chunk) { var data = eval(''('' + chunk + '')''); // parsing error alert(data.screen_name):
我知道它成功返回了带有以下内容的JSON块:
var socket = new io.Socket(); socket.on(''message'', function(chunk) { alert(chunk): // shows a JSON chunk
服务器:
response.on(''data'', function (chunk) { client.each(function(e) { e.send(chunk); });
发生了什么变化还是我做错了什么?
更新: ‘end’事件不会因为其流而触发?
http.get({ headers: { ''content-type'': ''application/json'' }, host: ''stream.twitter.com'', path: ''/1/statuses/filter.json?track...}, function(res) { res.setEncoding(''utf8''); res.on(''data'', function (chunk) { client.each(function(e) { e.send(chunk); }); }); // does not fire res.on(''end'', function () { });...
我正在研究与HTTP 1.0和HTTP 1.1在发送分块数据方面的区别。
答案1
小编典典查看Twitter文档中标题为“ 解析响应”的部分。
从Streaming API解析JSON响应很简单,每个对象都在自己的行上返回,并以回车结尾。对象元素(例如,状态对象的文本元素)中可能出现换行符(\
n),但回车符(\ r)不应出现。
在服务器端,继续堆积块,直到看到回车"\r"
。找到回车符后,提取字符串直到回车符,这将给我们一条鸣叫。
var message = ""; // variable that collects chunksvar tweetSeparator = "\r";res.on(''data'', function(chunk) { message += chunk; var tweetSeparatorIndex = message.indexOf(tweetSeparator); var didFindTweet = tweetSeparatorIndex != -1; if (didFindTweet) { var tweet = message.slice(0, tweetSeparatorIndex); clients.forEach(function(client) { client.send(tweet); }); message = message.slice(tweetSeparatorIndex + 1); }});
客户端变得简单。只需将套接字消息整体解析为JSON。
socket.on(''message'', function(data) { var tweet = JSON.parse(data);});
Flutter 使用 json_model 解析 json 生成 dart 文件
一、json_serializable 使用步骤
1. 集成 json_serializable
pubspec.yaml 添加以下依赖
dependencies:
json_annotation: ^2.0.0
dev_dependencies: build_runner: ^1.0.0 json_serializable: ^2.0.0
添加完记得执行 flutter packages get
2. 生成文件
在项目根目录下执行 flutter packages pub run json_model
即可生成 xxx.g.dart
3. 解析及序列化
注意导包 import ''dart:convert'';
///json转model
String jsonString = ''{"name": "Tony","email": "tony@example.com"}'' Map userMap = json.decode(jsonString); var user = User.fromJson(userMap); ///model转json String jsonEncode = json.encode(user); print(jsonEncode);
二、自动化生成模板
上述过程需要每次把 json 去生成网站去转化成 Model,接下来我们直接在本地生成,只需要写个 user.json 文件再执行下命令即可。这样每次 json 结构有修改后可以直接修改 json 文件再执行下命令即可,并且 json 结构能存在本地方便查看。
1. 使用 json_model
集成 json_model
dev_dependencies:
json_model: ^0.0.2 #最新版本
使用
- 在工程根目录下创建一个名为 "jsons" 的目录;
- 创建或拷贝 Json 文件到 "jsons" 目录中;
- 运行 pub run json_model (Dart VM 工程) or flutter packages pub run json_model (Flutter 中) 命令生成 Dart model 类,生成的文件默认在 "lib/models" 目录下
具体文档地址:https://github.com/flutterchina/json_model
2. 一点点小优化
上述方式直接导入插件包已经很方便了,但使用过程中遇到了一点问题:
- 生成的 model 文件名和 json 文件名一样,如果文件名有下划线
_
时生成的类名也是有下划线的,但我习惯使用驼峰命名 - 同上,当字段名中有下划线
_
,生成的字段也是有下划线的,要想使用驼峰命名需要手动在字段上方加上@JsonKey(name: ''user_name'')
- 自动解析数据类型只支持
bool num Map List
等几种常见类型,如果是DateTime
类型或其他类型的字段只能解析成 String。 - 生成的 model 没有完美的格式化,有强迫症的还得再手动格式化一下
如果你感觉这样不友好或有自己的书写习惯那么就自己动手吧。我这里按照自己的习惯改了一下:
- 类名,字段名驼峰命名
- 支持
DateTime
类型(后期有其他支持可以添加) - 完美的格式化
做法:不使用 json_model,自己动手
- 在工程根目录下创建一个名为 "jsons" 的目录;
- 创建或拷贝 Json 文件到 "jsons" 目录中;
- 在项目根目录下创建
mo.dart
文件,内容如下:
import ''dart:convert'';
import ''dart:io'';
import ''package:path/path.dart'' as path;
const TAG = "\$";
const SRC = "./json"; //JSON 目录
const DIST = "lib/models/"; //输出model目录
void walk() {
//遍历JSON目录生成模板
var src = new Directory(SRC);
var list = src.listSync();
var template = "import ''package:json_annotation/json_annotation.dart'';\r\n%t\npart ''%s.g.dart'';\r\n\r\n@JsonSerializable()\r\nclass %s {\r\n %s();\r\n\r\n %sfactory %s.fromJson(Map<String, dynamic> json) => _\$%sFromJson(json);\r\n\r\n Map<String, dynamic> toJson() => _\$%sToJson(this);\r\n}\r\n";
File file;
list.forEach((f) {
if (FileSystemEntity.isFileSync(f.path)) {
file = new File(f.path);
var paths = path.basename(f.path).split(".");
String name = paths.first;
if (paths.last.toLowerCase() != "json" || name.startsWith("_")) return;
if (name.startsWith("_")) return;
//下面生成模板
var map = json.decode(file.readAsStringSync());
//为了避免重复导入相同的包,我们用Set来保存生成的import语句。
var set = new Set<String>();
StringBuffer attrs = new StringBuffer();
(map as Map<String, dynamic>).forEach((key, v) {
if (key.startsWith("_")) return;
/// #############################
///处理key包含"_"时,转为驼峰并加上@JsonKey(name="key")
if (key.contains("_")) {
attrs.write(''@JsonKey(name: "$key")'');
attrs.write("\r\n ");
attrs.write(getType(v, set, name));
attrs.write(" ");
attrs.write(changeToCamelCase(key, false));
attrs.writeln(";");
attrs.write("\r\n ");
} else {
attrs.write(getType(v, set, name));
attrs.write(" ");
attrs.write(key);
attrs.writeln(";");
attrs.write("\r\n ");
}
});
String className = "";
/// #############################
///处理有"_"时class不是驼峰命名
if (name.contains("_")) {
className = changeToCamelCase(name, true);
} else {
className = name[0].toUpperCase() + name.substring(1);
}
var dist = format(template, [
name,
className,
className,
attrs.toString(),
className,
className,
className
]);
var _import = set.join(";\r\n");
_import += _import.isEmpty ? "" : ";";
dist = dist.replaceFirst("%t", _import);
//将生成的模板输出
new File("$DIST$name.dart").writeAsStringSync(dist);
}
});
}
/// #############################
///转为驼峰命名
///big 是否大驼峰
String changeToCamelCase(String word, bool big) {
if (word.contains("_")) {
String result = "";
List<String> words = word.split("_");
for (var value in words) {
result += (value[0].toUpperCase() + value.substring(1).toLowerCase());
}
return big ? result : (result[0].toLowerCase() + result.substring(1));
} else {
return big
? word[0].toUpperCase() + word.substring(1)
: word[0].toLowerCase() + word.substring(1);
}
}
String changeFirstChar(String str, [bool upper = true]) {
return (upper ? str[0].toUpperCase() : str[0].toLowerCase()) +
str.substring(1);
}
//将JSON类型转为对应的dart类型
String getType(v, Set<String> set, String current) {
current = current.toLowerCase();
if (v is bool) {
return "bool";
} else if (v is num) {
return "num";
} else if (v is Map) {
return "Map<String,dynamic>";
} else if (v is List) {
return "List";
} else if (v is String) {
/// #############################
///添加DateTime类型
try {
DateTime dateTime = DateTime.parse(v);
if (dateTime != null) {
return "DateTime";
}
} catch (e) {}
//处理特殊标志
if (v.startsWith("$TAG[]")) {
var className = changeFirstChar(v.substring(3), false);
if (className.toLowerCase() != current) {
set.add(''import "$className.dart"'');
}
/// #############################
/// 自定义model类型名字大驼峰命名
return "List<${changeToCamelCase(className, true)}>";
} else if (v.startsWith(TAG)) {
var fileName = changeFirstChar(v.substring(1), false);
if (fileName.toLowerCase() != current) {
set.add(''import "$fileName.dart"'');
}
/// #############################
/// 自定义model类型名字大驼峰命名
return changeToCamelCase(fileName, true);
}
return "String";
} else {
return "String";
}
}
//替换模板占位符
String format(String fmt, List<Object> params) {
int matchIndex = 0;
String replace(Match m) {
if (matchIndex < params.length) {
switch (m[0]) {
case "%s":
return params[matchIndex++].toString();
}
} else {
throw new Exception("Missing parameter for string format");
}
throw new Exception("Invalid format string: " + m[0].toString());
}
return fmt.replaceAllMapped("%s", replace);
}
void main() {
walk();
}
这里是生成 model 的方法及模板,Json_model 的前身,来自这里
其中注释包含 “#############################” 的地方是修改过的地方,大家要有自己的需求可以自行修改。
- 在项目根目录下创建
mo.sh
文件,内容如下:
#!/usr/bin/env bash
dart mo.dart
flutter packages pub run build_runner build --delete-conflicting-outputs
这个是脚本,把命令打包后一起执行
注:如果你没有配置 dart 环境变量,需要配置一下:(Mac 下)
vim ~/.bash_profile
- 添加
export PATH=your flutter path/flutter/bin/cache/dart-sdk/bin:$PATH
source ~/.bash_profile
dart --version
正常显示版本号即可
- 以上都配置完后只需一步,项目根目录下执行
sh mo.sh
,ok,一切完美的搞定了,给大家看看结果
重要参考:
https://www.jianshu.com/p/b20514e16e10
https://book.flutterchina.club/chapter10/json_model.html
linux中安装nodejs,卸载nodejs,更新nodejs,git
在Linux中安装、卸载、更新Node.js和Git的步骤如下:
- 安装Node.js:可以使用包管理器如apt(Debian或Ubuntu)或yum(Fedora或RHEL)进行安装。例如,在Ubuntu系统中,可以使用以下命令安装Node.js:
sudo apt-get update
sudo apt-get install nodejs
sudo apt-get install npm
- 卸载Node.js:使用包管理器进行卸载。例如,在Ubuntu系统中,可以使用以下命令卸载Node.js:
sudo apt-get remove nodejs
sudo apt-get remove npm
- 更新Node.js:可以先卸载旧版Node.js,然后安装新版。也可以使用n模块进行更新:
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
- 安装Git:依然可以使用包管理器进行安装。例如,在Ubuntu系统中,可以使用以下命令安装Git:
sudo apt-get update
sudo apt-get install git
- 卸载Git:使用包管理器进行卸载。例如,在Ubuntu系统中,可以使用以下命令卸载Git:
sudo apt-get remove git
- 更新Git:可以先卸载旧版Git,然后安装新版。例如,在Ubuntu系统中,可以使用以下命令更新Git:
sudo apt-get remove git
sudo apt-get install git
请根据自己的Linux发行版和版本选择合适的命令。
Node.js Twitter客户端
是否有一个用于node.js的Twitter客户端(不是流式API,即常规API)?
我已经了解了twitter-node,但是我正在寻找一个允许使用Twitter REST API的更通用的客户端。
有人有主意吗?
谢谢,
约翰娜森
node.js – MongoDB nodejs:如何查询ISODate字段?
我有一个日期属性存储为ISODate类型的文档。
通过nodejs,我使用这个查询:
db.collection("log").find({ localHitDate: { '$gte': '2013-12-12T16:00:00.000Z','$lt': '2013-12-12T18:00:00.000Z' } })
它什么也没有返回为了使其工作,我需要做以下改为:
db.collection("log").find({ localHitDate: { '$gte': ISODate('2013-12-12T16:00:00.000Z'),'$lt': ISODate('2013-12-12T18:00:00.000Z') } })
但是我的nodejs代码中不能识别ISODate。
那么,如何通过我的nodejs程序对mongo date字段进行查询?
谢谢
解决方法
new是必须的,因为Date()已经用来返回日期字符串。
ISODate在mongodb中被概念化,您可以在mongodb控制台中使用它,但对于不同的编程语言,它可能会有所不同。
今天关于nodejs-解析块状Twitter json和node.js解析json的介绍到此结束,谢谢您的阅读,有关Flutter 使用 json_model 解析 json 生成 dart 文件、linux中安装nodejs,卸载nodejs,更新nodejs,git、Node.js Twitter客户端、node.js – MongoDB nodejs:如何查询ISODate字段?等更多相关知识的信息可以在本站进行查询。
本文标签: