GVKun编程网logo

nodejs-解析块状Twitter json(node.js解析json)

15

最近很多小伙伴都在问nodejs-解析块状Twitterjson和node.js解析json这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展Flutter使用json_model解

最近很多小伙伴都在问nodejs-解析块状Twitter jsonnode.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(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 文件

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 #最新版本
使用
  1. 在工程根目录下创建一个名为 "jsons" 的目录;
  2. 创建或拷贝 Json 文件到 "jsons" 目录中;
  3. 运行 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,自己动手

  1. 在工程根目录下创建一个名为 "jsons" 的目录;
  2. 创建或拷贝 Json 文件到 "jsons" 目录中;
  3. 在项目根目录下创建 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 的前身,来自这里

其中注释包含 “#############################” 的地方是修改过的地方,大家要有自己的需求可以自行修改。

  1. 在项目根目录下创建 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 正常显示版本号即可
  1. 以上都配置完后只需一步,项目根目录下执行 sh mo.sh,ok,一切完美的搞定了,给大家看看结果
     
 
 
 
 

重要参考:
https://www.jianshu.com/p/b20514e16e10
https://book.flutterchina.club/chapter10/json_model.html

 

 

linux中安装nodejs,卸载nodejs,更新nodejs,git

linux中安装nodejs,卸载nodejs,更新nodejs,git

在Linux中安装、卸载、更新Node.js和Git的步骤如下:

  1. 安装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
  1. 卸载Node.js:使用包管理器进行卸载。例如,在Ubuntu系统中,可以使用以下命令卸载Node.js:
sudo apt-get remove nodejs
sudo apt-get remove npm
  1. 更新Node.js:可以先卸载旧版Node.js,然后安装新版。也可以使用n模块进行更新:
sudo npm cache clean -f
sudo npm install -g n
sudo n stable
  1. 安装Git:依然可以使用包管理器进行安装。例如,在Ubuntu系统中,可以使用以下命令安装Git:
sudo apt-get update
sudo apt-get install git
  1. 卸载Git:使用包管理器进行卸载。例如,在Ubuntu系统中,可以使用以下命令卸载Git:
sudo apt-get remove git
  1. 更新Git:可以先卸载旧版Git,然后安装新版。例如,在Ubuntu系统中,可以使用以下命令更新Git:
sudo apt-get remove git
sudo apt-get install git

请根据自己的Linux发行版和版本选择合适的命令。

Node.js Twitter客户端

Node.js Twitter客户端

是否有一个用于node.js的Twitter客户端(不是流式API,即常规API)?

我已经了解了twitter-node,但是我正在寻找一个允许使用Twitter REST API的更通用的客户端。

有人有主意吗?

谢谢,

约翰娜森

node.js – MongoDB nodejs:如何查询ISODate字段?

node.js – MongoDB nodejs:如何查询ISODate字段?

我正在使用nodejs与node-mongodb本机驱动程序( http://mongodb.github.io/node-mongodb-native/)。

我有一个日期属性存储为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字段进行查询?

谢谢

解决方法

您可以在node.js中使用新的Date(‘2013-12-12T16:00:00.000Z’);

new是必须的,因为Date()已经用来返回日期字符串。

ISODate在mongodb中被概念化,您可以在mongodb控制台中使用它,但对于不同的编程语言,它可能会有所不同。

今天关于nodejs-解析块状Twitter jsonnode.js解析json的介绍到此结束,谢谢您的阅读,有关Flutter 使用 json_model 解析 json 生成 dart 文件、linux中安装nodejs,卸载nodejs,更新nodejs,git、Node.js Twitter客户端、node.js – MongoDB nodejs:如何查询ISODate字段?等更多相关知识的信息可以在本站进行查询。

本文标签: