从元素

时间:2017-10-24 12:58:11

标签: c# json xml

下面是我的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直接转换为我的类对象,因为第三方告诉我他们经常为他们的类结构添加。

1 个答案:

答案 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