写出大文件时日期时间格式不正确

时间:2013-01-24 22:38:47

标签: json.net

我读了大型json文件,更改了某些内容然后将其写回磁盘:

using (var reader = new StreamReader(filePath))
        {
            var log = (JObject)JToken.ReadFrom(new JsonTextReader(reader));
            //log = UpdateOneLog(log);
            using (var writer = new StreamWriter(updateFilePath))
            {
                log.WriteTo(new JsonTextWriter(writer));
                writer.Close();
            }
            reader.Close();
        }

甚至

JObject o1 = JObject.Parse(File.ReadAllText(inputFile));
File.WriteAllText(outputFile, o1.ToString());

某些文件发生了奇怪的事情,我认为它与文件大小有关。日期时间应该是开始日期时间“:”2013-01-17T11:00:40.000-06:00“但它会被写入文件startDateTime”:“2013-01-17T11:00:40-06:00”(请注意,缺少第二个“000”的分数。我甚至评论了我的更新逻辑,如上所示。我正在做的就是读取文件并将其写回来,但日期会出现乱码..

我做错了吗?

-Stan

1 个答案:

答案 0 :(得分:0)

由于理由仍然不清楚(这可能是一个错误),Json.Net有时会错误地解析日期/时间的毫秒部分。因此,例如在字符串“2013-01-17T11:00:40.230-06:00”中,毫秒部分“230”被下垂,字符串变为“2013-01-17T11:00:40-06:00”是无效的。我找到的解决方法是在保存时循环遍历所有标记,并将毫秒替换为某个值,如下所示。

    [TestMethod]
    public void LoadAndSave()
    {
        var directory = @"..\..\Files";
        var inputFile = Path.Combine(directory, "LargeFile.har");
        var outputFile = Path.Combine(directory, "LargeFileResult.har");

        if (File.Exists(outputFile))
            File.Delete(outputFile);

        StreamWriter sw = null;
        JsonTextWriter jTextWriter = null;
        StreamReader sr = null;
        JsonTextReader jTextReader = null;
        try
        {
            sw = new StreamWriter(outputFile);
            jTextWriter = new JsonTextWriter(sw);
            sr = new StreamReader(inputFile);
            jTextReader = new JsonTextReader(sr);
            while (jTextReader.Read())
            {
                var tokenType = jTextReader.TokenType;
                var tokenValue = jTextReader.Value;
                var tokenString = jTextReader.Value as string;
                switch (tokenType)
                {
                    case JsonToken.Boolean:
                    case JsonToken.Bytes:
                    case JsonToken.Float:
                    case JsonToken.Integer:
                    case JsonToken.String:
                          jTextWriter.WriteValue(tokenValue);
                        break;                        
                    case JsonToken.Comment:
                        jTextWriter.WriteComment(tokenString);
                        break;
                    case JsonToken.Date:
                        DateTime date = (DateTime)tokenValue;
                        DateTime dateWrite = new DateTime(date.Year, date.Month, date.Day, date.Hour, date.Minute, date.Second, 100, date.Kind);
                        jTextWriter.WriteValue(dateWrite);
                        break;
                    case JsonToken.EndArray:
                        jTextWriter.WriteEndArray();
                        break;
                    case JsonToken.EndConstructor:
                        jTextWriter.WriteEndConstructor();
                        break;
                    case JsonToken.EndObject:
                        jTextWriter.WriteEndObject();
                        break;                        
                    case JsonToken.None:                                
                        break;
                    case JsonToken.Null:
                        jTextWriter.WriteNull();
                        break;
                    case JsonToken.PropertyName:
                        jTextWriter.WritePropertyName(tokenString);
                        break;
                    case JsonToken.Raw:
                        jTextWriter.WriteRaw(tokenString);
                        break;
                    case JsonToken.StartArray:
                        jTextWriter.WriteStartArray();
                        break;
                    case JsonToken.StartConstructor:
                        jTextWriter.WriteStartConstructor(tokenString);
                        break;
                    case JsonToken.StartObject:
                        jTextWriter.WriteStartObject();
                        break;                        
                    case JsonToken.Undefined:
                        jTextWriter.WriteUndefined();
                        break;
                    default:
                        break;
                }                                            
            }
        }
        finally
        {
            jTextReader.Close();
            sr.Close();
            jTextWriter.Close();
            sw.Close();               
        }