【发布时间】:2020-11-09 07:12:38
【问题描述】:
我正在尝试将 Json 中的列表(使用 Newtonsoft.json)转换为自定义的“元素”结构,其中我将有许多类,其中都有一个名为“元素”的属性,但是一些任意类型。
下面代码中使用的一个例子是这个json:
{
"List_A": [1, 2],
"List_B": ["Hello", "World"]
}
在第一个属性“List_A”中,需要将数字转换为 AΞElement 类,该类具有 int 类型的属性 Element。
在第二个属性“List_B”中,需要将这些字符串转换成不同的类BΞElement。
下面是工作代码,我试图填写我创建的 ListConverter 类的 ReadJson 函数,即 JsonConverter。我正在尝试弄清楚如何从序列化程序中读取内容,并创建自己的自定义对象。
using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.Serialization;
using Newtonsoft.Json;
namespace ConsoleApp1
{
class Program
{
[DataContract]
public class AΞElement
{
[DataMember]
int _Element;
public int Element
{
get => _Element;
set => _Element = value;
}
}
[DataContract]
public class BΞElement
{
[DataMember]
string _Name;
public string Element
{
get => _Name;
set => _Name = value;
}
}
[DataContract]
public class C
{
[DataMember]
List<AΞElement> List_A { get; set; } = new List<AΞElement>();
[DataMember]
List<BΞElement> List_B { get; set; } = new List<BΞElement>();
}
static void Main(string[] args)
{
var json = "{ \"List_A\": [1, 2], \"List_B\": [\"Hello\", \"World\"] }";
var c = JsonConvert.DeserializeObject<C>(json, new JsonSerializerSettings()
{
Converters = new List<JsonConverter> { new ListConverter() }
});
}
public class ListConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return typeof(IList).IsAssignableFrom(objectType);
}
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
{
if (existingValue != null)
{
var list = (IList)existingValue;
list.Clear();
}
var elementType = existingValue.GetType().GetGenericArguments()[0];
if (elementType.Name.EndsWith("ΞElement"))
{
/// What do I put here??
}
else
{
serializer.Populate(reader, existingValue);
}
return existingValue;
}
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
{
throw new NotImplementedException();
}
}
}
}
注意:我必须保持ΞElement和json的类结构相同。
【问题讨论】:
-
Ξ是用于命名的有效字符吗? -
是的。上面的代码是完全可编译的,并且可以运行。测试一下
-
尽管使用该字符只是手头问题的一个小细节,只要有一些关键方法来识别我正在处理的这些类。
-
这是一个奇怪的设计。为什么不简单地使用
List<int>和List<string>?对我来说似乎是XYProblem。您要解决的问题是什么? -
我别无选择,我必须这样做
标签: c# json.net deserialization