Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/120.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dart从不可编辑的大文件读取json对象_Dart - Fatal编程技术网

Dart从不可编辑的大文件读取json对象

Dart从不可编辑的大文件读取json对象,dart,Dart,我有一个不可编辑的大文件,我有更多的jsonObject,例如: {"id":"@123456","v":"1"} String file= new File('file.json').readAsStringSync(); Map<String, dynamic> data = json.decode(file); 这不是我无法解析和读取的jsonArray,例如: {"id":

我有一个不可编辑的大文件,我有更多的
jsonObject
,例如:

{"id":"@123456","v":"1"}
String file= new File('file.json').readAsStringSync();
Map<String, dynamic> data = json.decode(file);
这不是我无法解析和读取的
jsonArray
,例如:

{"id":"@123456","v":"1"}
String file= new File('file.json').readAsStringSync();
Map<String, dynamic> data = json.decode(file);
String file=new file('file.json')。readAsStringSync();
Map data=json.decode(文件);

您认为如何从文件中读取此对象并显示键和值?

尝试以下解决方案。最后,我为您的输入格式创建了一个解析器,它将返回流中每个解析的JSON对象

如果JSON中的任何字符串包含
{
}
,则解析器将无法工作。如果是这样的话,我可以扩展解析器,让它考虑到这一点,但我不想让它变得过于高级

import 'dart:async';
import 'dart:convert';
import 'dart:io';

Future<void> main() async {
  final ids = await File('large_file.json')
      .openRead()
      .transform(const Utf8Decoder())
      .transform<dynamic>(JsonObjectTransformer())
      .map((dynamic json) => json['id'] as String)
      .toList();

  print(ids); // [@123456, @123456]
}

class JsonObjectTransformer extends StreamTransformerBase<String, dynamic> {
  static final _openingBracketChar = '{'.codeUnitAt(0);
  static final _closingBracketChar = '}'.codeUnitAt(0);

  @override
  Stream<dynamic> bind(Stream<String> stream) async* {
    final sb = StringBuffer();
    var bracketsCount = 0;

    await for (final string in stream) {
      for (var i = 0; i < string.length; i++) {
        final current = string.codeUnitAt(i);
        sb.writeCharCode(current);

        if (current == _openingBracketChar) {
          bracketsCount++;
        }

        if (current == _closingBracketChar && --bracketsCount == 0) {
          yield json.decode(sb.toString());
          sb.clear();
        }
      }
    }
  }
}
导入'dart:async';
导入“dart:convert”;
导入“dart:io”;
Future main()异步{
final id=wait File('large_File.json'))
.openRead()
.transform(const Utf8Decoder())
.transform(JsonObjectTransformer())
.map((动态json)=>json['id']作为字符串)
.toList();
打印(ID);//[@123456,@123456]
}
类JsonObjectTransformer扩展了StreamTransformerBase{
静态最终_openingBracketChar='{'.codeunit(0);
静态final _closingBracketChar='}'.codeunit(0);
@凌驾
流绑定(流-流)异步*{
最终sb=StringBuffer();
var BracketScont=0;
等待(流中的最终字符串){
对于(变量i=0;i
当您说文件很大时,是因为文件太大,无法同时在内存中存储所有内容,所以需要流媒体解决方案吗?或者它足够小,可以一次性解析所有对象,然后将数据放入列表中吗?@julemand101只需将对象中的所有
id
放入另一个文件就足够了OK,所以您只需获取每个对象的
id
,然后将其放入另一个文件中即可?对象是否如问题中所述表示?因此json保存为多行。因为如果是这样的话,你可以很容易地遍历这个文件,grep包含
id
字段的每一行并对其进行解析。@julemand101是的,我只想获取
id
并将其存储到另一个文件中,我不知道如何从文件中获取每个对象我认为这段代码只适用于格式化的json,例如,您的代码在这个结构中找不到
id
{“id”:“@123456”,“@version”:“1”,“typ”:“cfm”,“access\u hash”:“78846881970209896”,“user\u id”:1,“timestamp”:“2020-01-26T13:53:29.467Z”,“path”:“/home/user/”,“type”:“text”,“flags”:2135,“host”:“ubuntu”,“imported\u from”:“account”}是的,如我的回答所述“此解决方案基于与提供的文件格式相同的文件格式,因此每个键值对位于单独的行上。”更新了新输入格式的答案。希望它对您有用。:)我如何解决
未终止字符串
错误?我在文件上有
关于
json对象,我得到了以下错误:
格式异常:未终止字符串(第2行,第38字符){“关于”:���� ���� �������� ���������� ���� ����������:}您的JSON文件似乎不在UTF-8中。如果您希望正确解析内容,则需要在Dart中为文件使用正确的解码器。如果您不关心此错误,则可以使用
const Utf8Decoder(allowMalformed:true)
创建
Utf8Decoder