簡體   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