List<double> to Json 在c#中如何用科学计数法写?

How to write List<double> to Json in scientific notation in c#?

我正在尝试将列表序列化为 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, ...

你正在做 dblValue.ToString("E") 这就是你得到字符串的原因。

您明确设置了值的格式。不要那样做 - 将元素直接添加到数组中:

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]

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

查看here了解详情。