我有第一个Newtonsoft.Json.Linq.JArray个这样的 struct :

[
  {
    "Fields": [
      {
        "Value": "child",
        "Key": "Relationship"
      },
      {
        "Value": "Alex",
        "Key": "FirstName"
      }
    ]
  }
]

另有Newtonsoft.Json.Linq.JArray人:

[
  {
    "Relationship": "child",
    "FirstName": "Alex"
  }
]

把第二个变成第一个是真的吗?我对C#和Linq没有太多的经验.

推荐答案

要将第一个JSON样例转换为第二个JSON样例,可以使用LINQ to JSON,如下所示:

// Parse (or load from a stream) the incoming JSON as a JArray
var array = JArray.Parse(jsonString);

// For each object in the array, query they Key/Value properties of each Fields[*] object and turn then into a single JPropery, 
// then add those properties to a new JObject
var query = array.Select(i => 
    new JObject(i.SelectTokens("Fields[*]").Select(o => new JProperty((string)o["Key"], o["Value"]))));

// Create a new JArray from the query
var newArray = new JArray(query);

最棘手的部分在这里:

i => new JObject(i.SelectTokens("Fields[*]").Select(o => 
    new JProperty((string)o["Key"], o["Value"])))

该表达式如下:

  1. 使用SelectTokens()查询根数组项中的所有Fields[*]个对象;
  2. 然后获取每个对象的"Key""Value"个属性;
  3. 然后把它们变成一个单独的JProperty
  4. 并最终将这JProperty个实例组合成单个JObject个.

请注意,如果这[*].Fields[*].Key个属性中的一个属性丢失,上面的代码将抛出异常,因此您可能需要判断一下.

演示小提琴#1here.

同样,要将第二个样本转换为第一个样本,您可以执行以下操作:

var query = array
    .OfType<JObject>()
    .Select(o => 
           new JObject
           {
               {"Fields", new JArray(o.Properties().Select(p => new JObject{{"Key", p.Name}, {"Value", p.Value}}))},
           });

var newArray = new JArray(query);

这里我使用C#的S dictionary collection initializer syntax来初始化我的JObject个实例,我可以这样做,因为JObject实现了IDictionary<string, JToken>.

here. history of life

Csharp相关问答推荐

获取Windows和Linux上的下载文件夹

在包含空项的列表上使用具有断言T的摘要表

我需要两个属性类吗

在一个模拟上设置一个方法,该模拟具有一个参数,该参数是一个numc函数表达式

S能够用DATETIME来计算,这有什么错呢?

从.Net 6 DLL注册和检索COM对象(Typelib导出:类型库未注册.(异常来自HRESULT:0x80131165))

使用预定义对象减少Task.Run/Factory.StartNew中的关闭开销

如何在WPF的树视图中显示一个对象的两个或多个属性,其中只有一个是分层项?

为基本审计设置Audit.EntityFramework.Core

MSTest--将消息直接写入StdOut和使用TestContext有什么不同?

如何在同一成员上组合[JsonPropertyName]和[ObservableProperty]?

将FileStream的特定部分作为字节数组读取

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

为什么我的用户界面对象移动到略低于实际目标?

如何在使用属性 Select 器时判断是否可以为空

删除MudRadio时,MudRadioGroup未 Select 正确的MudRadio

SharpZipLib在文件名前加上目录名,生成tar.gz

Cmd中的&ping.end()";有时会失败,而";ping";总是有效

ASP.NET核心MVC|如何在控制器方法之间传递值

如何在flutter dart中使用publicKey.xml文件进行rsa加密,我遇到了问题Exception:Could not parse BigInt