![](/img/trans.png)
[英]Use C# to loop through XML document and if condition is met replace value or node
[英]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()函數。
對於這樣的問題,您可以做兩件事:
我強烈建議使用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.