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了解详情。
我正在尝试将列表序列化为 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了解详情。