簡體   English   中英

C#如果滿足條件,請使用結果並通過相同的方法運行它

[英]C# If a condition is met, use the result and run it through the same method

我正在輪詢API,這些API以相同的格式返回不同類型的JSON字符串,這些格式包含列表,列表內,列表內。 這是一個例子:

[
    {
        "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("");
                }
                else
                {
                    lineItem.Add(value.ToString());
                }
            }
        }
        return string.Join(",", lineItem);
    }

最終目標是使列標題包含屬性名稱,並以分隔格式包含此屬性下每個屬性的數據。 在此先感謝您的幫助!

編輯:對不起,我應該對此進行擴展。 我確實使用Newtonsoft反序列化為json對象。

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

然后,我將該對象發送到DelimetedString()函數。

對於這樣的問題,您可以做兩件事:

  • 為傳入的json對象創建數據模型,或者
  • 使用“動態”類型的對象

我強烈建議使用Newtonsoft的Json.NET來反序列化json。 https://www.newtonsoft.com/json

這個怎么樣?:

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(',');
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM