C# 如果满足条件,则使用结果并通过相同的方法运行

我正在轮询以相同格式返回不同类型的 JSON 字符串的 API,这些字符串包含列表、列表内、列表内。下面是一个例子:


[

    {

        "name": "string",

        "production": true,

        "start_timestamp": "string",

        "end_timestamp": "string",

        "width": 0,

        "height": 0,

        "scale": 0,

        "floors": [

            {

                 "number": 0,

                 "display_name": "string",

                 "map_image_url": "string",

                 "inside_image_url": "string",

                 "zone_maps": [

                     {

                         "name": "string",

                         "display_name": "string",

                         "zone_image_url": "string",

                         "zones": [

                             {

                                 "name": "string",

                                 "display_name": "string",

                                 "color": "string"

                             }

                         ]

                     }

                 ]

             }

         ]

     }

]

我正在尝试为所有 API 创建一个动态方法,这些方法获取第一个列表的所有属性的值并将它们连接成 csv 的字符串。然后,如果在这些属性中找到另一个列表,请再次执行相同的方法,直到没有更多列表。这是我当前的示例代码:


    public static string DelimetedString(object obj)

    {

        List<string> lineItem = new List<string>();


        Type myObject = obj.GetType();


        foreach (var v in myObject.GetProperties())

        {

            var objType = v.PropertyType.Name;

            if (objType.Contains("List"))

            {                  

                DelimetedString(v); //It is here where I would like to loop through the next list                                 

            }

            else

            {

                var value = v.GetValue(obj, null);

                if (value == null)

                {

                    lineItem.Add("");

                }

            }

        }

    }

最终目标是拥有包含属性名称的列标题,以及以分隔格式显示的每个属性的数据。在此先感谢您的帮助!


编辑:抱歉,我应该对此进行扩展。我确实使用 Newtonsoft 反序列化为 json 对象。


MyClass _myObject = JsonConvert.DeserializeObject<MyClass>(responseJson);   

然后我将该对象发送到 DelimedString() 函数。


梵蒂冈之花
浏览 271回答 2
2回答

芜湖不芜

对于这样的问题,您可以做两件事:为传入的 json 对象创建数据模型,或使用“动态”类型的对象我强烈建议使用 Newtonsoft 的 Json.NET 来反序列化 json。&nbsp;https://www.newtonsoft.com/json

郎朗坤

这个怎么样?:public static string GetCsvFromJson(JToken node){&nbsp; &nbsp; var result = "";&nbsp; &nbsp; if (!node.HasValues)&nbsp; &nbsp; &nbsp; &nbsp; return node.ToString();&nbsp; &nbsp; foreach (var child in node.Children())&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; result += GetCsvFromJson(child) + ",";&nbsp; &nbsp; }&nbsp; &nbsp; return result.TrimEnd(',');}调用它:string commaSeparatedValues = GetCsvFromJson(JToken.Parse(yourJsonString));如果您已经序列化了 json 值,那么我将尝试编辑您的函数。如果类型名称包含列表,则不检查类型名称,顺便说一句,这是不安全的,您可以更进一步,直到对象是值类型或字符串(字符串是引用类型):&nbsp; &nbsp; public static string DelimetedString(object obj)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; var result = "";&nbsp; &nbsp; &nbsp; &nbsp; if (obj.GetType().IsValueType || obj is string)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return obj.ToString();&nbsp; &nbsp; &nbsp; &nbsp; if (obj is IEnumerable)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var item in (IEnumerable)obj)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result += DelimetedString(item) + ",";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; else&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; foreach (var prop in type.GetProperties())&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result += DelimetedString(prop.GetValue(obj)) + ",";&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; return result.TrimEnd(',');&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP