gpt4 book ai didi

c# - 将 C# 类转换为具有自定义结构的 Json

转载 作者:行者123 更新时间:2023-11-30 21:31:06 25 4
gpt4 key购买 nike

我们的 C# 类如下所示

public class PrimaryContact
{
public string PrefixTitle { get; set; }

public string SurName { get; set; }

public string GivenName { get; set; }
}

我们需要将json对象序列化为

"primaryContact": {
"prefixTitle": {
"value": "mrs"
},
"surName": "abcd",
"givenName": "abcd"
}

请注意,prefixTitle 具有。对于某些选定的属性,我们需要像这样序列化。此外,我们需要从 JSON 中读取并反序列化到类中。是否有任何通用的最佳方法可以通过装饰元素来实现这一结果?

最佳答案

因为您已经用 标记了您的问题,您可以通过应用 custom JsonConverter 来做到这一点到应该嵌套在 {"value" : ... } 中的“选定属性”序列化时的对象。

首先,定义如下转换器:

public class NestedValueConverter<T> : JsonConverter
{
class Value
{
public T value { get; set; }
}

public override bool CanConvert(Type objectType)
{
throw new NotImplementedException();
}

public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
switch (reader.MoveToContent().TokenType)
{
case JsonToken.Null:
return null;

default:
return serializer.Deserialize<Value>(reader).value;
}
}

public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
serializer.Serialize(writer, new Value { value = (T)value });
}
}

public static partial class JsonExtensions
{
public static JsonReader MoveToContent(this JsonReader reader)
{
if (reader.TokenType == JsonToken.None)
reader.Read();
while (reader.TokenType == JsonToken.Comment && reader.Read())
;
return reader;
}
}

现在,将其应用于PrimaryContact 的“选定属性”如下:

public class PrimaryContact
{
[JsonConverter(typeof(NestedValueConverter<string>))]
public string PrefixTitle { get; set; }

public string SurName { get; set; }

public string GivenName { get; set; }
}

你将能够反序列化和序列化如下:

var settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
};
var root = JsonConvert.DeserializeObject<RootObject>(jsonString, settings);

var json2 = JsonConvert.SerializeObject(root, Formatting.Indented, settings);

注意事项:

fiddle 示例 here .

关于c# - 将 C# 类转换为具有自定义结构的 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53736394/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com