繁体   English   中英

如何编写列表<double>在 c# 中以科学计数法转换为 Json?</double>

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

我正在尝试将 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, ...

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

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 的常规 output 的 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();
    }
}

Output:

[-9.811880E-002,2.236657E-002,-4.020144E-001]

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

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

在这里查看详细信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM