繁体   English   中英

将 JSON 数组转换为另一种结构

[英]Convert JSON array into another structure

我正在寻找一种可以使用 C# 转换 JSON 结构的解决方案。 目前,我正在尝试使用 Newtonsoft 库转换此 JSON 结构,但我没有找到任何解决方案。

下面的 JSON 需要转换

[
    [
        {
            "FieldName": "Id",
            "Value": 1234
        },
        {
            "FieldName": "FieldName1",
            "Value": 2722
        },
        {
            "FieldName": "FieldName2",
            "Value": "2022-06-21T13:03:11.5958542Z"
        },
        {
            "FieldName": "FieldName3",
            "Value": "XYZ"
        }
    ]
]

上述 JSON 所需的 JSON 结构

[
    {
        "Id": 1234,
        "FieldName1" : 2722,
        "FieldName2" : "2022-06-21T13:03:11.5958542Z",
        "FieldName3" : "XYZ"
    }
]

你必须遍历你的内部数组。

必须创建一个JObject并在循环中填充输入数组中的数据。

必须检查值的数据类型: int.TryParse
在布尔值的情况下,必须扩展 if 条件。

public void Transform()
{
    var data = "[ [ { \"FieldName\": \"Id\", \"Value\": 1234 }, { \"FieldName\": \"FieldName1\", \"Value\": 2722 }, { \"FieldName\": \"FieldName2\", \"Value\": \"2022-06-21T13:03:11.5958542Z\" }, { \"FieldName\": \"FieldName3\", \"Value\": \"XYZ\" } ] ]";

    var input = JArray.Parse(data);
    var inputFirst = input[0] as JArray;

    var outputItem = new JObject();

    foreach (JObject item in inputFirst)
    {
        var fieldName = item["FieldName"].Value<string>();
        var fieldValue = item["Value"].Value<string>();

        if (int.TryParse(fieldValue, out int fieldIntValue))
        {
            outputItem[fieldName] = fieldIntValue;
        }
        else
        {
            outputItem[fieldName] = fieldValue;
        }
    }

    var output = new JArray();
    output.Add(outputItem);

    var result = output.ToString();
    Console.WriteLine(result);
}

Console.WriteLine(result); 写入以下 JSON:

[
  {
    "Id": 1234,
    "FieldName1": 2722,
    "FieldName2": "06/21/2022 13:03:11",
    "FieldName3": "XYZ"
  }
]

基本上,@Markus 解释了如何从输入转换为输出的概念。

此解决方案与System.Linq一起使用,并且能够转换为多个对象。

如果您的数据是:

[
  [ {...}, {...}, ... ], // Array 1
  [ ], // Array 2
  ...
]
  1. 转换为JArray
  2. 迭代(第一级)数组项。
  3. 迭代(二级)数组项并添加该项以成为字典。
using System.Linq;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

var result = JArray.Parse(json)
            .Select(x => 
            {
                Dictionary<string, dynamic> dict = new ();

                foreach (JObject jObj in x.ToObject<List<JObject>>())
                {
                    dict.Add(jObj["FieldName"].ToString(), Int32.TryParse(jObj["Value"].ToString(), out int @value) ? @value : jObj["Value"].ToString());    
                }

                return dict;
            })
            .ToList();

.NET 小提琴示例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM