以下是示例代码:
class Program
{
public class A : I {
string a = "myClassA";
// whatever
}
public class B : I
{
string b = "myClassB";
// whatever
}
public interface I
{
// whatever
}
public static void myFunction<T>(List<T> list)
{
Console.WriteLine(list[0].GetType().Name); // OUTPUT : A
Console.WriteLine(JsonConvert.SerializeObject(list[0])); // OUTPUT : {}
}
static void Main(string[] args)
{
List<I> myList = new List<I>();
myList.Add(new A());
myFunction(myList); // arguments mismatch ERROR
}
}
我需要此函数来输出带有适当字段的JSON(此处应为{"a":"myClassA"}
我该怎么办?
我的真实背景:
List<string> JSONElements = new List<string>();
List<I> myList = null;
getDataInList(ref myList);
listToJSON(myList, ref JSONElements);
// ...
public void getDataInList(ref List<I> theList) {
// insert data in list
// every elements will be A or every elements will be B
}
// ...
public void listToJSON(List<I> myList, ref List<string> JSONElements) {
foreach (var element in myList) {
// I want every field to be included
// interface has no fields
JSONElements.Add(JsonConvert.SerializeObject(element));
}
}
此函数“listToJSON”无法正确序列化(每个元素都为{}
)
我该如何解决这个问题?
答案 0 :(得分:5)
你能保持
public void myFunction(List<I> list)
(由I
而非T
),然后更改
List<A> myList = new List<A>();
到
List<I> myList = new List<I>();
在回复您的编辑后,底部的代码打印出来:
{&#34; Word&#34;:&#34; hello&#34;,&#34; Number&#34;:1}
{&#34; Word&#34;:&#34;再见&#34;,&#34; Number&#34;:2}
完成后,按任意键......
我在https://www.nuget.org/api/v2/的NuGet供稿中使用Newtonsoft.JSon版本6.0.0.0。
但是,当我将public string Word { get; set; }
更改为string Word { get { return "Hello"; } }
时,Word
未被序列化。我不知道newtonsoft JSON序列化器是如何工作的#34;引擎盖下#34;但我想如果该字段是私有的,那么它可能会更难(de)序列化它。
public class Program
{
public class A : I
{
public string Word { get; set; }
public int Number { get; set; }
}
public interface I
{
int Number { get; set; }
}
public static void listToJSON(List<I> myList, ref List<string> JSONElements)
{
foreach (var element in myList) {
JSONElements.Add(JsonConvert.SerializeObject(element));
}
}
static void Main(string[] args)
{
List<I> myList = new List<I>();
myList.Add(new A { Word = "hello", Number = 1});
myList.Add(new A { Word = "goodbye", Number = 2});
List<string> jsonElements = new List<string>();
listToJSON(myList, ref jsonElements);
Console.WriteLine(string.Join("\n", jsonElements));
Console.WriteLine("Done, press any key...");
Console.ReadKey();
}
}
答案 1 :(得分:1)
我认为原因最好通过
来证明public void myFunction(List<I> list)
{
list.Add(new B());
}