使用泛型实现所需JSON格式的数据

问题描述 投票:0回答:1

我有一个通用类说

public class Generic<T>
{
   public T Data {get; set;}
}

假设我有一个匿名对象,比如

var r1 = new {
    A = lstA,
        validation = null as ValidationError
    }

var r2 =  new {
    B = lstB,
        validation = null as ValidationError
    }

我分配如下

Generic<object> g1 = new Generic<object>
g1.Data = r1

Generic<object> g2 = new Generic<object>
g2.Data = r2

当我使用 JsonSerialize.Serialize (g1) 序列化 g1 以上时,我得到了输出

{
   "Data":{
      "A":[
         {
            
         }
      ],
      "validation":null
   }
}

{
   "Data":{
      "B":[
         {
            
         }
      ],
      "validation":null
   }
}

现在我通过将匿名 r1 分配给 g1.Data 实现了上述 JSON 格式。仅使用泛型是否可以实现上述 JSON 格式?

上述 JSON 格式中的名称“A”在每种情况下都不同。在一种情况下可以是“A”,在另一种情况下可以是“B”等等。

我尝试了上面的代码,并使用匿名类型和泛型实现了所需的 JSON 格式。想知道是否可以单独使用ibg泛型来实现上述JSON格式,或者有更好的方法吗?

c# json .net generics anonymous-types
1个回答
0
投票

我认为你不需要使用泛型。听起来您只是希望属性名称相同,无论该特定属性(和其他属性)是 A、B 还是 Elephant。

如果您必须使用动态对象,请考虑创建一个可以重命名属性的自定义合同解析器:https://www.newtonsoft.com/json/help/html/contractresolver.htm

或者,您可以只使用

Newtonsoft.Json
中的 [JsonProperty(PropertyName = "YourName")] 属性。这是一个例子:

internal class SomethingA
{
    [JsonProperty(PropertyName = "C")]
    public IList<int> A { get; set; }
}

internal class SomethingB
{
    [JsonProperty(PropertyName = "C")]
    public IList<int> B { get; set; }
}

internal class Program
{
    static void Main(string[] args)
    {
        var somethingA = new SomethingA { A = new List<int> { 1, 2 } };
        var somethingB = new SomethingB { B = new List<int> { 3, 4 } };

        var aSerialized = JsonConvert.SerializeObject(somethingA); // gives {"C":[1,2]}
        var bSerialized = JsonConvert.SerializeObject(somethingB); // gives {"C":[3,4]}
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.