C# 如果条件满足,使用结果和 运行 它通过相同的方法
C# If a condition is met, use the result and run it through the same method
我正在轮询 API,return 不同类型的 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);
}
最终目标是让第 headers 列包含 属性 个名称,并且此列下每个 属性 的数据以分隔格式显示。在此先感谢您的帮助!
编辑:抱歉,我应该对此进行扩展。我确实使用 Newtonsoft 反序列化为 json object。
MyClass _myObject = JsonConvert.DeserializeObject<MyClass>(responseJson);
然后我将 object 发送到 DelimetedString() 函数。
对于这样的问题你可以做两件事:
- 为传入的json对象创建数据模型,或者
- 使用 "dynamic"
类型的对象
我强烈建议使用 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 值,我会尝试编辑您的函数。如果它包含列表,而不是检查类型名称,它是不安全的 btw,你可以进一步直到对象是值类型或字符串(字符串是引用类型):
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(',');
}
我正在轮询 API,return 不同类型的 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);
}
最终目标是让第 headers 列包含 属性 个名称,并且此列下每个 属性 的数据以分隔格式显示。在此先感谢您的帮助!
编辑:抱歉,我应该对此进行扩展。我确实使用 Newtonsoft 反序列化为 json object。
MyClass _myObject = JsonConvert.DeserializeObject<MyClass>(responseJson);
然后我将 object 发送到 DelimetedString() 函数。
对于这样的问题你可以做两件事:
- 为传入的json对象创建数据模型,或者
- 使用 "dynamic" 类型的对象
我强烈建议使用 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 值,我会尝试编辑您的函数。如果它包含列表,而不是检查类型名称,它是不安全的 btw,你可以进一步直到对象是值类型或字符串(字符串是引用类型):
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(',');
}