【问题标题】:Create JSON array from existing array with different key-value pairs [closed]从具有不同键值对的现有数组创建 JSON 数组 [关闭]
【发布时间】:2019-12-15 06:57:00
【问题描述】:

我需要转换以下 JSON 数组:

    [{
    "ID": 2,
    "NAME": "name_1",
    "UUID": "something"
    }, {
    "ID": 3,
    "NAME": "name_2",
    "UUID": "something-else"
    }]

到这样的 JSON 数组中:

    [{
    "ATTRIBUTE": "ID",
    "EXAMPLE_1": "2",
    "EXAMPLE_2": "3"
    }, {
    "ATTRIBUTE": "NAME",
    "EXAMPLE_1": "name_1",
    "EXAMPLE_2": "name_2"
    }, {
    "ATTRIBUTE": "UUID",
    "EXAMPLE_1": "something",
    "EXAMPLE_2": "something-else"
    }

如您所见,我需要将第一个数组中的键作为第二个数组中的值,并且我只想获取一次。在第一次迭代之后,我想将一个值附加到一个对象,但我需要通过 ATTRIBUTE 值找到该对象。

我对 C# 很陌生,但我打算使用 JSON.NET

【问题讨论】:

  • 请与我们分享您的 C# 代码。 Stack Overflow 不是代码编写服务,但我们很乐意帮助您使代码正常工作。
  • Stack Overflow 不是代码编写服务。不过,我们很乐意帮助您使解决方案发挥作用。请向我们展示您的尝试
  • 将原始 JSON 解析为对象序列后,您可以遍历该序列并将三个原始属性中的每一个收集为具有三个新属性的三个新对象。 (您可以通过搜索“透视数据”来了解更多关于这种过程的信息。)然后您可以将这些对象序列化为新的 JSON。

标签: c# arrays json json.net


【解决方案1】:

如果您想使用 Linq 完成此操作,您可以使用以下内容。

var json = @" [{
'ID': 2,
'NAME': 'name_1',
'UUID': 'something'
}, {
'ID': 3,
'NAME': 'name_2',
'UUID': 'something-else'
}]";

var newData = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(json)
                    .SelectMany(x=> x.Select(c=>new {c.Key,c.Value}))
                    .GroupBy(x=>x.Key)
                    .Select(x=> (new List<KeyValuePair<string,string>>{new KeyValuePair<string,string>("ATTRIBUTE",x.Key)}
                            .Union(x.ToList().Select((f,index)=> new KeyValuePair<string,string>($"EXAMPLE_{index+1}",f.Value)).ToList())))
                    .Select(x=>x.ToDictionary(c=>c.Key,c=>c.Value));

var newDataSerialized = JsonConvert.SerializeObject(newData); 

输出

[
  {
    "ATTRIBUTE": "ID",
    "EXAMPLE_1": "2",
    "EXAMPLE_2": "3"
  },
  {
    "ATTRIBUTE": "NAME",
    "EXAMPLE_1": "name_1",
    "EXAMPLE_2": "name_2"
  },
  {
    "ATTRIBUTE": "UUID",
    "EXAMPLE_1": "something",
    "EXAMPLE_2": "something-else"
  }
]

【讨论】:

    【解决方案2】:

    要实现您要查找的内容,您可以序列化 Dictionary 对象列表,其中包含您希望包含的模型的每个属性的值。

    例如:

        //this is the List that you will use to produce the expected JSON format
        List<Dictionary<string, object>> values = new List<Dictionary<string, object>>();
    
        //setup a Dictionary for every property you want to include
        Dictionary<string, object> ids = new Dictionary<string, object>();
        ids.Add("Attribute", "Id");
        for(int i = 0; i < examples.Count; i++)
            ids.Add("Example_" + (i + 1).ToString(), examples[i].Id);
    
        //add the dictionary to the list to be included in the JSON
        values.Add(ids);
    
        //serialize
        string json = JsonConvert.SerializeObject(values);
    

    还有其他方法可以填充Dictionary 对象的列表,例如使用反射,但这只是为了演示这个想法。

    this fiddle 中的完整工作示例。

    HTH

    【讨论】:

    • 谢谢,会试试这个解决方案。我只需要对其进行调整并使其通用,因为输入的 JSON 键名是动态的。
    猜你喜欢
    • 1970-01-01
    • 2022-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2017-11-19
    • 2013-12-05
    相关资源
    最近更新 更多