将 JSON 对象 A 转换为 JSON B 对象,其中 B 是 A 的严格子集。两者都由两个 json 模式控制。在 .net 核心中

Convert a JSON object A to JSON B object where B is a strict subset of A. Both governed by two json schemas. In .net core

我进行了一系列转换,以便将 JSON 数据结构从超集转换为子集。例如:

A : 
{
  Name {
    first: bob
    middle: john
    last : bobster    
  }
}

B : 
{
  Name {
    first: bob
    last : bobster    
  }
}

两者都有一个 json 模式来描述它们的结构,并且结构完全相同,只是 B 只是缺少 A 的一些属性

有没有关于将 A 映射到 B 的简单方法的想法(实质上是从 A 中剥离 B 中不存在的属性)?我想知道是否有一些库或 C# 语言功能可以使这变得微不足道。

使用 C# 和 .NET Core。

为子集创建一个对象,如:

public class Name{
public string first{get;set;}
public string last {get;set;}
}

将json反序列化为子集对象:

var test = JsonConvert.DeserializeObject<Name>(superset);

如果需要,您可以使用它转换回 json:

JsonConvert.SerializeObject(subset)

您可以使用继承将对象从子class 转换为另一个class。

鉴于以下 json

{
    "Name": 
    {
        "first": "bob",
        "middle": "john",
        "last" : "bobster"
    }
}

您可以创建一些匹配 json 结构的 C# classes,如下所示:

public class Model
{
    public FullName Name { get; set; }
}

public class Name
{
    [JsonProperty("first")]
    public string First { get; set; }

    [JsonProperty("last")]
    public string Last { get; set; }
}


public class FullName : Name
{
    [JsonProperty("middle")]
    public string Middle { get; set; }
}

请注意:

  • FullName 继承自 Name
  • class Model 有一个 属性 类型 FullName (即最具体的对象)

您可以反序列化模型类型的对象,然后按如下方式转换 Name 属性:

string json = @"{
    ""Name"": 
    {
        ""first"": ""bob"",
        ""middle"": ""john"",
        ""last"" : ""bobster""
    }
}";

Model model = JsonConvert.DeserializeObject<Model>(json);
Name name = model.Name as Name;

编辑

作为替代方案,您可以创建一个通用 class,如下所示

public class Model<TName> where TName : Name
{
    public TName Name { get; set; }
}

反序列化 json:

string json = @"{
    ""Name"": 
    {
        ""first"": ""bob"",
        ""middle"": ""john"",
        ""last"" : ""bobster""
    }
}";

var fullName = JsonConvert.DeserializeObject<Model<FullName>>(json);
var name = JsonConvert.DeserializeObject<Model<Name>>(json);