Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C中从纯文本值序列化类# 让我们考虑一个班级 public class Money { public decimal Value { get; set; } }_C#_.net_.net Core_Json Deserialization_System.text.json - Fatal编程技术网

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
vs
List
),有两种创建自定义转换器的模式。有关更多详细信息,请参阅链接。

我不确定是否完全遵循: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;