为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
梵蒂冈之花 2021-11-14 15:11:58
我正在轮询以相同格式返回不同类型的 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() 函数。
查看完整描述

2 回答

?
芜湖不芜

TA贡献1796条经验 获得超7个赞

对于这样的问题,您可以做两件事:

  • 为传入的 json 对象创建数据模型,或

  • 使用“动态”类型的对象

我强烈建议使用 Newtonsoft 的 Json.NET 来反序列化 json。 https://www.newtonsoft.com/json


查看完整回答
反对 回复 2021-11-14
?
郎朗坤

TA贡献1921条经验 获得超9个赞

这个怎么样?:


public static string GetCsvFromJson(JToken node)

{

    var result = "";


    if (!node.HasValues)

        return node.ToString();


    foreach (var child in node.Children())

    {

        result += GetCsvFromJson(child) + ",";

    }


    return result.TrimEnd(',');

}

调用它:


string commaSeparatedValues = GetCsvFromJson(JToken.Parse(yourJsonString));

如果您已经序列化了 json 值,那么我将尝试编辑您的函数。如果类型名称包含列表,则不检查类型名称,顺便说一句,这是不安全的,您可以更进一步,直到对象是值类型或字符串(字符串是引用类型):


    public static string DelimetedString(object obj)

    {

        var result = "";


        if (obj.GetType().IsValueType || obj is string)

            return obj.ToString();


        if (obj is IEnumerable)

        {

            foreach (var item in (IEnumerable)obj)

            {

                result += DelimetedString(item) + ",";

            }

        }

        else

        {

            foreach (var prop in type.GetProperties())

            {

                result += DelimetedString(prop.GetValue(obj)) + ",";

            }

        }


        return result.TrimEnd(',');

    }


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 268 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信