0

我正在尝试像这样将 List 序列化为 json 文件

class ScientificDoubleConverter : JsonConverter
{
  public override bool CanRead { get { return true; } }
  public override bool CanConvert(Type objectType)
  {
    return true;
  }

  public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
  {
    if (value is List<double> myList)
    {

      JArray myArray = new JArray();
      myList.ForEach(dblValue => myArray.Add(dblValue.ToString("E")));
      myArray.WriteTo(writer);

    }
  }
}

这有效,但我得到了 qoutes 的值

"values": ["-9,811880E-002", "2,236657E-002", "-4,020144E-001", ...

我不想要引号和价值科学记数法

"values": [-9.811880E-002, 2.236657E-002, -4.020144E-001, ...
4

3 回答 3

4

您正在明确格式化这些值。不要那样做 - 将元素直接添加到数组中:

if (value is List<double> myList)
{
    JArray myArray = new JArray();
    foreach (var element in myList)
    {
        myArray.Add(element);
    }
    myArray.WriteTo(writer);
}

或直接写信给作者:

if (value is List<double> myList)
{
    writer.WriteStartArray();
    foreach (var element in myList)
    {
        writer.WriteValue(element);
    }
    writer.WriteEndArray();
}

这可能无法达到您想要的精确表示(就科学记数法而言),但它将获得您尝试序列化的数据的有效 JSON 表示。任何读取 JSON 的东西都应该能够从 JSON 中读取完全相同的值。

如果您绝对必须自定义格式,您可以使用JsonWriter.WriteRawValue, 使用不变的文化来格式化您的值。但我强烈建议你不要这样做。我会对无法处理 Json.NET 的常规输出的 JSON 解析器感到非常惊讶。如果您真的必须这样做,这是一个完整的示例:

using System;
using System.Globalization;
using System.Collections.Generic;
using Newtonsoft.Json;

class Program
{    
    static void Main(string[] args)
    {
        var writer = new JsonTextWriter(Console.Out);
        var list = new List<double>
        {
            -9.811880E-002,
            2.236657E-002,
            -4.020144E-001
        };
        WriteList(writer, list);
    }

    static void WriteList(JsonWriter writer, List<double> list)
    {
        writer.WriteStartArray();
        foreach (var element in list)
        {
            writer.WriteRawValue(element.ToString("E", CultureInfo.InvariantCulture));
        }
        writer.WriteEndArray();
    }
}

输出:

[-9.811880E-002,2.236657E-002,-4.020144E-001]
于 2019-11-14T15:15:32.570 回答
0

你正在做dblValue.ToString("E")这就是为什么你得到字符串。

于 2019-11-14T15:10:54.873 回答
0

JArray.Add除了 Object 也作为参数。因此,您不必将双精度转换为字符串。直接加入数组即可。

这里查看详细信息。

于 2019-11-14T15:18:30.977 回答