将文本文件转换为干净的 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 格式的主要内容,如果未能解决你的问题,请参考以下文章