0

大きな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());

特定のファイルで奇妙なことが起こりますが、それはファイル サイズに関係があると思います。日時は startedDateTime":"2013-01-17T11:00:40.000-06:00" である必要がありますが、ファイルには startedDateTime":"2013-01-17T11:00:40-06:00" として書き込まれます (秒の「000」の端数が欠落していることに注意してください)。上記のように、更新ロジックをコメントアウトしました。私がしているのは、ファイルを読み込んで書き戻すことだけですが、日付が文字化けします..

私は何か間違ったことをしていますか?

-スタン

4

1 に答える 1

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();               
        }
于 2013-03-10T21:14:48.930 に答える