C# 在C中从纯文本值序列化类# 让我们考虑一个班级 public class Money { public decimal Value { get; set; } }
假设这是另一个类的一部分C# 在C中从纯文本值序列化类# 让我们考虑一个班级 public class Money { public decimal Value { get; set; } },c#,.net,.net-core,json-deserialization,system.text.json,C#,.net,.net Core,Json Deserialization,System.text.json,假设这是另一个类的一部分 public class UserAccount { public Money Balance { get; set; } } 在序列化时,UserAccount生成如下内容: { "balance": { "value": 1.0 } } 现在我想把它转换成这样的json { "balance": 1.0 } 这与使用自定义格式化程序序列化DateTime的方式类似
public class UserAccount
{
public Money Balance { get; set; }
}
在序列化时,UserAccount
生成如下内容:
{
"balance": {
"value": 1.0
}
}
现在我想把它转换成这样的json
{
"balance": 1.0
}
这与使用自定义格式化程序序列化DateTime
的方式类似。Json.Net和MSDN建议使用自定义格式化程序,效果良好。但是有没有办法直接从Money
或UserAccount
类处理这个问题
编辑:澄清
Datetime经常这样做。
例如,Datetime的序列化应该如下所示:
但不,它看起来就像04-12-2021 00:00:00
编辑2:使用一个自定义的格式化程序,就像在这本书中建议的那样,我希望使用它作为最后一个选项。但这意味着库的每个消费者都必须实现并寻找一种方法来避免它。转换器可以简单到:
public class MoneyJsonConverter : JsonConverter<Money>
{
public override Money Read(
ref Utf8JsonReader reader,
Type typeToConvert,
JsonSerializerOptions options) =>
new Money { Value = decimal.Parse(reader.GetString(), CultureInfo.InvariantCulture) };
public override void Write(
Utf8JsonWriter writer,
Money v,
JsonSerializerOptions options) =>
writer.WriteStringValue(v.Value.ToString(CultureInfo.InvariantCulture));
}
用法是
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;
参考文献是。
这不适用于这种情况,但请注意,根据处理的类型(例如,
List
vsList
),有两种创建自定义转换器的模式。有关更多详细信息,请参阅链接。我不确定是否完全遵循:Class userData有一个属性“userId”,Class test包含userData实例的属性。因此,从技术上讲,数据是一组新的{}值,测试的标准是:{“数据”:{“用户ID”:“1}}},而不是您的示例中的标准。我建议您只需创建一个新类:“TestJson”公共类TestJson(){public string data{get;set;}},然后将Userdata中的UserId映射到该值以获得所需的结果。当Userdata
包含多个属性时,这可能会有所帮助。这就是重点。该示例实质上意味着它应该从该值反序列化为完整类。值“1”应反序列化为“Data.UserId=1”@MortenBork@gunr2171现在我的要求只有一个字段,但也许我们也可以有多个字段。(Datetime又是一个很好的例子。)
public class Money { public decimal Value { get; set; } }
public class WithMoney { public Money MyMoney { get; set; } }
static void Main(string[] args)
{
var serializeOptions = new JsonSerializerOptions
{
WriteIndented = true,
Converters = { new MoneyJsonConverter() }
};
var m = new WithMoney { MyMoney = new Money { Value = 6.66m } };
var json = JsonSerializer.Serialize(m, serializeOptions);
Console.WriteLine(json);
var m2 = JsonSerializer.Deserialize<WithMoney>(json, serializeOptions);
Console.WriteLine(m2.MyMoney.Value);
}
{
"MyMoney": "6.66"
}
6.66
using System.Globalization;
using System.Text.Json;
using System.Text.Json.Serialization;