将文本文件转换为干净的 JSON 格式

Posted

技术标签:

【中文标题】将文本文件转换为干净的 JSON 格式【英文标题】:Convert text file into clean JSON format 【发布时间】:2014-06-26 20:33:54 【问题描述】:

我想读取一个文本文件并以干净的 JSON 格式写入一个文本文件。

我的文本文件是这样的

Version:2
TaxiStation:6072
TaxiLicense:EM9543
System_ID:910

当我使用以下内容时:

data2= JSON.stringify(data2, null, position+1);
fs.writeFile(dirarray[0], data2, function(err)  ...

我的输出总是很难看:"Version:2\r\nTaxiStation:6072\r\nTaxiLicense:EM8378\r\n

理想情况下,我想让我的文本文件格式化得很好。有没有可能做到这一点?


   "Version":2,
   "TaxiStation":6072,
   "TaxiLicense":"EM9543",
   "System_ID":910

【问题讨论】:

你试过我的答案了吗?为了给您提供上下文示例,我尝试将其添加到您在另一条评论中发布的代码中:pastebin.com/5KWM7kmB 这对您有用吗? 【参考方案1】:

主要问题是 stringify 函数将获取一个 js 对象并将其 jsonize,但您的文件不是对象、数组或任何东西,因此,一旦读取,它就会被解释为单个字符串。所以它被解析为一个字符串!

您应该从您的文件中创建一个与您的行匹配的 js 对象,然后对其进行解析。

这是一个工作示例:http://pastebin.com/EhnhNUyB

主要部分在这里

dataArr = data2.split('\n');

var obj = ;

for (i=0;i<dataArr.length;i++) 
    keyVal = dataArr[i].split(":");

    var key = keyVal[0];

    var val;
    if(isInt(keyVal[1])) 
        val = parseInt(keyVal[1]);
     else 
        val = keyVal[1];
    
    obj[key] = val;


data2 = JSON.stringify(obj, null, 4);

如您所见,我创建了一个新对象并将新的键值推送给它。

【讨论】:

您的答案中没有包含 isInt() 函数,但我认为无论如何猜测该对中值的数据类型并不明智。将每个值保留为字符串,否则您最终可能会猜错并“破坏”数据。 例如,诸如“1E1”之类的字符串将通过您对isInt() 的测试,而当传递给parseInt() 时将返回1。 第二个例子,英国电话号码如"01234567890"将通过isInt()测试,并在通过parseInt()后返回1234567890(丢失字符串开头的0) 第三个例子。由于 javascript 和大数字的精度问题,isInt() 将为“9999999999999999999”返回 true,但 parseInt() 将返回 10000000000000000000。这又是数据丢失/损坏。 @Enrichman JSON 的美妙之处在于无需猜测类型(因为类型可以通过上下文推断),并且 JSON 支持的数据类型是 Javascript 支持的数据类型的子集。但是,您不能指望这些数据中的任何一个。这种“猜测数据类型和类型转换”的练习并不是这里最好的方法。当他知道相应的值应该包含某种类型时,他应该只对值进行类型转换。【参考方案2】:

在对数据进行字符串化之前,使用类似的方法来转换数据:

data2 = data2.split(/\r?\n/).reduce(function(m,i)
    var s = i.split(':');
    m[s.shift()] = s.join(':');
    return m;
, );

JSON.stringify(data2);

【讨论】:

不错 :) 你也可以m[s[0]] = parseInt(s[1]) || s[1]; 添加对解析字符串/数字的支持 好主意,但这会将1.234 之类的数字四舍五入为1,并将"56FGHW99" 之类的字符串解释为56。不幸的是,与 JSON 不同,他的日志格式不指示数据类型。因此,为了安全起见,最好将其保存为字符串。 值得为空行或不符合KEY:VALUE 对的行添加检查。 不。一些字符串仍然会被解释为数字,即使它们应该是字符串。如果你有一个像“5E2”这样的字符串,那么你的输出中就会有一个数字:500。这是数据损坏/丢失。有关失败原因的更多示例,请参阅@Enrichman 的答案中的我的 cmets。 抱歉回复晚了,我会尽快测试一下。

以上是关于将文本文件转换为干净的 JSON 格式的主要内容,如果未能解决你的问题,请参考以下文章

“CSV格式转Json格式”Shell脚本解析

如何将 .Rdata 格式转换为文本文件格式

怎么把php格式的文件转换为TXT格式的文本?

将 HTML 代码转换为纯文本,格式可用于文本文件 [重复]

如何将文本文件从 DOS 格式转换为 UNIX 格式

如何将Excel文件转为json格式的呢