注意:此答案是假设您将使用Json.Net 编写的。发布后,我意识到您从未在问题中具体提及您正在使用(或想要使用)的序列化程序。我认为您仍然可以将此处介绍的相同技术用于其他序列化程序,但您可能需要进行调整。 YMMV。
好吧,只要您的映射不重叠,那么一个简单的解决方案是在您的类中使用私有设置器供 Json.Net 使用,这将设置正确的公共属性。这是因为 Json.Net 将忽略不在 JSON 中的类成员。如果您采用这种方法,修改后的类如下所示:
class DeserializedJson
{
public string field_1 { get; set; }
public string field_2 { get; set; }
public string field_3 { get; set; }
[JsonProperty]
private string field_007
{
set { field_3 = value; }
}
[JsonProperty]
private string field_111
{
set { field_1 = value; }
}
}
这里有一个演示来证明这是可行的:
class Program
{
static void Main(string[] args)
{
DeserializeAndDump(1, @"{""field_1"":""a"",""field_2"":""b"",""field_3"":""c""}");
DeserializeAndDump(2, @"{""field_1"":""d"",""field_2"":""e"",""field_007"":""f""}");
DeserializeAndDump(3, @"{""field_111"":""g"",""field_2"":""h"",""field_3"":""i""}");
}
private static void DeserializeAndDump(int n, string json)
{
Console.WriteLine("--- API " + n + " ---");
DeserializedJson obj = JsonConvert.DeserializeObject<DeserializedJson>(json);
Console.WriteLine("field_1: " + obj.field_1);
Console.WriteLine("field_2: " + obj.field_2);
Console.WriteLine("field_3: " + obj.field_3);
Console.WriteLine();
}
}
输出:
--- API 1 ---
field_1: a
field_2: b
field_3: c
--- API 2 ---
field_1: d
field_2: e
field_3: f
--- API 3 ---
field_1: g
field_2: h
field_3: i
当然,如果 JSON 中的 field_007 有时映射到您的班级中的 field_3 和有时映射到 field_2,则此方法将不起作用。如果是这种情况,那么您需要为每个不同的 API 方法创建一个单独的“DeserializedJson”类。您可以让它们都继承自同一个基类,并在每个子类中使用上述技术在基类中设置正确的属性。这就是它的样子:
class DeserializedJson
{
public string field_1 { get; set; }
public string field_2 { get; set; }
public string field_3 { get; set; }
}
class DeserializedJsonAPI1 : DeserializedJson
{
[JsonProperty]
private string field_007
{
set { field_2 = value; }
}
}
class DeserializedJsonAPI2 : DeserializedJson
{
[JsonProperty]
private string field_007
{
set { field_3 = value; }
}
}
演示:
class Program
{
static void Main(string[] args)
{
DeserializeAndDump<DeserializedJsonAPI1>(1, @"{""field_1"":""q"",""field_007"":""r"",""field_3"":""s""}");
DeserializeAndDump<DeserializedJsonAPI2>(2, @"{""field_1"":""x"",""field_2"":""y"",""field_007"":""z""}");
}
private static void DeserializeAndDump<T>(int n, string json) where T : DeserializedJson
{
Console.WriteLine("--- API " + n + " ---");
DeserializedJson obj = JsonConvert.DeserializeObject<T>(json);
Console.WriteLine("field_1: " + obj.field_1);
Console.WriteLine("field_2: " + obj.field_2);
Console.WriteLine("field_3: " + obj.field_3);
Console.WriteLine();
}
}
输出:
--- API 1 ---
field_1: q
field_2: r
field_3: s
--- API 2 ---
field_1: x
field_2: y
field_3: z