下面是我的JSON,它来自我必须使用的第三方的API调用。我试图将其转换为XML,然后能够获取所有ViewModel元素,因此我可以将它们提取到一个类(逐个)中,然后将其保存到我们的数据库中。我使用GetElementsById,直到我注意到'DepartmentID'都在ApiResult和ViewModel元素中。在ViewModel中返回的类的数组是动态的,因此它是每个不同API调用的不同类。
{
"ApiResult": {
"ApiLogId": 2841360,
"ApiLogGuid": "a783bc36-89f1-409a-a728-1f05c42231b7",
"ApiSuccessCode": "SUCCESS",
"ApiSuccessFlag": true,
"ApiAuthenticatedFlag": true,
"ApiFunctionId": 110,
"EventId": 130305,
"OrganizationId": 1,
"SiteId": 3,
"DepartmentId": 10102,
"ScopeTypeId": 2,
"ScopeTypeCode": "ORGANIZATION"
},
"ViewInfo": {
"EntityType": "DbTable",
"IsFound": true,
},
"ViewModel": [
{
"DepartmentId": 10102,
"DepartmentCode": "DEMO",
"DepartmentName": "Demonstration"
},
{
"DepartmentId": 8,
"DepartmentCode": "SALES",
"DepartmentName": "Sales"
},
{
"DepartmentId": 7,
"DepartmentCode": "HR",
"DepartmentName": "Human Resources"
},
{
"DepartmentId": 6,
"DepartmentCode": "ENGR",
"DepartmentName": "Engineering"
}
]}
这是我原来的通用方法。我希望能够传入任何类对象,并提取与类属性匹配的元素。如果元素名称在XML中是唯一的,则此方法非常有效。然而,DepartmentId在我的装备上插了一把扳手。
public static List<T> ExtractXmltoClassList<T>(HttpResponseMessage http, string elementName) where T : new()
{
var ctorType = typeof(T);
var classList = new List<T>();
var doc = JsonConvert.DeserializeXmlNode(http.Content.ReadAsStringAsync().Result, "root");
var count = doc.GetElementsByTagName(ctorType.GetProperties()[0].Name).Count;
for (var x = 0; x < count; x++) //Itterate the number of times the tag was found (= number of elements)
{
var newClass = new T();
foreach (var prop in ctorType.GetProperties())
{
var tags = doc.GetElementsByTagName(prop.Name);
if (tags.Count <= 0 || tags[x].InnerText.Trim() == "")
continue;
if (prop.PropertyType == typeof(int))
prop.SetValue(newClass, Utility.ToInt(tags[x].InnerText));
else if (prop.PropertyType == typeof(long))
prop.SetValue(newClass, Utility.ToLong(tags[x].InnerText));
else if (prop.PropertyType == typeof(double))
prop.SetValue(newClass, Utility.ToDouble(tags[x].InnerText));
else if (prop.PropertyType == typeof(float))
prop.SetValue(newClass, Utility.ToFloat(tags[x].InnerText));
else if (prop.PropertyType == typeof(bool))
prop.SetValue(newClass, Utility.ToBool(tags[x].InnerText));
else if (prop.PropertyType == typeof(string))
prop.SetValue(newClass, tags[x].InnerText);
else if (prop.PropertyType == typeof(DateTime))
prop.SetValue(newClass, Utility.ToDateTime(tags[x].InnerText));
else if (prop.PropertyType == typeof(Guid))
prop.SetValue(newClass, Utility.ToGuid(tags[x].InnerText));
}
classList.Add(newClass);
}
return classList;
}
由于这不再正常工作,我想只提取ViewModel元素,然后像以前一样处理它。当我最初使用JsonConvert.DeserializeXmlNode时,我认为我传入的根元素名称是我想要开始提取的元素的名称。 (我的坏)
我如何达到同样的预期效果? (请注意,我的ViewModel对象数组没有元素名称。这是因为XML ViewModel对从API返回的模型类进行了更改。
PS:我无法将JSON直接转换为我的类对象,因为第三方告诉我他们经常为他们的类结构添加。
答案 0 :(得分:0)
我找到了我正在寻找的答案。我转换为XDocument,然后获取其中的元素,而不是使用XmlDocument。这使我能够传入任何对象类和类名,并返回一个对象列表。
find /home/user/Folder_1/videos_orig/ -type d | while read ligne
do
cd "$ligne"
for i in *.mp4;
do
ffmpeg -y -i "$i" -ar 44100 -c:v libx265 -b:v 1000 -c:a mp3 -b:a 128k /home/user/Folder_1/videos_encoded"$(basename "${i/.mp4}").mp4"
done
done