zoukankan      html  css  js  c++  java
  • 被坑记之:从拼接字符串中将对象解析出来

    描述下背景:目前做一个项目,需要对接第三方提供的WebService接口,读取xml数据并保存进数据库。然后而拿到数据的时候有点蒙蔽。返回来的数据是这样子的:

    [{material_number=04.04.09.001.0398, material_model=WYD33W04-2200, qty=128, entry_id=frpbjbgpQheLY3CkGASZEiYEHMU=, material_name=浴霸2200W, totalReceiptQty=0}, 
    {material_number=04.04.09.001.0399, material_model=WYD36W05-2200, qty=3332, entry_id=hTuWOEN2SAmasjdHve10syYEHMU=, material_name=浴霸2200W, totalReceiptQty=40},
    {material_number=04.04.09.001.0400, material_model=WYD36W05-2400, qty=1000, entry_id=EUqVAulQQDidTA+N1RBQnSYEHMU=, material_name=浴霸2400W, totalReceiptQty=40},
    {material_number=04.04.09.001.0401, material_model=WYD36W05-2600, qty=660, entry_id=D/NFnu3dTZGlzO16K6ThDSYEHMU=, material_name=浴霸2600W, totalReceiptQty=40},
    {material_number=04.04.09.001.0407, material_model=WYD36W11-2600, qty=200, entry_id=Ut5TcbHCQc602ibG0na7tiYEHMU=, material_name=浴霸2600W, totalReceiptQty=40},
    {material_number=04.04.09.001.0404, material_model=WYD36S08-1200, qty=1660, entry_id=YP/F0BgQT1+NA2QXEovgmSYEHMU=, material_name=浴霸1200W, totalReceiptQty=0},
    {material_number=04.04.09.001.0405, material_model=WYD33X09-35, qty=300, entry_id=P6BSIaibSLeoNyRwafiBkiYEHMU=, material_name=凉霸35W, totalReceiptQty=0},
    {material_number=04.04.09.001.0406, material_model=WYD33X10-40, qty=2000, entry_id=a+Yr0Ep8QWWPha7p36mmnSYEHMU=, material_name=换气扇40W, totalReceiptQty=0}]
     [{
    
    orderCustomerNnumber=01.008.0001, 
    material_number=01.01.21.050.0579, 
    material_model=T=0.3锰钢 表面:镀镍 26*10*8.5mm 图号:CMLS-MT5X06-009, 
    qty=1500, 
    orderCustomerName=华东零星客户, 
    entry_id=6GBFaZ78TjikdC/OjvLwA8z9SSM=, 
    material_name=挂板, 
    shippedQty=1500
    
                }, {orderCustomerNnumber=01.008.0001, material_number=01.02.12.001.0080, material_model=十字沉头4*20AN铁镀锌Rohs, qty=1500, orderCustomerName=华东零星客户, 
    entry_id=E/u2J7tGR7m1zdz/tCKk4cz9SSM=, material_name=螺丝, shippedQty=1500}]
    [{orderCustomerNnumber=01.008.0001, material_number=01.02.13.070.3045, material_model=10W光面球泡-商超版彩盒-6500K-350G灰底白板,尺寸62*62*115,WA2W21-10-886E-02-SC, qty=3000, 
    orderCustomerName=华东零星客户, entry_id=jOgMCPN/TP2nY170m1XU8sz9SSM=, material_name=内盒, shippedQty=3000}]

    好吧

    1、直接序列化对象肯定是不可行的了

    2、尝试将字符串通过字符替换的方式转换为可序列化的Json格式,最终也以失败告终,因为它的值包含了“,”、“:”等,即什么情况都可以出现,无法进行替换。

    3、好吧 那只能进行字符截取了:将类的属性名称解析出来,遍历获得属性名称在字符串中的索引,再通过索引将字符串中的值分割出来。

    4、好吧 不知道有没有更好的办法

    5、花了一个晚上的时候来处理了这个问题

    6、最坑的来了,将写好的方法跑测试,发现存到了一些空的行,检查一下,发现返回的数据居然正常了,返回xml格式了,居然正常了,常了!!!!!!!!!!!

    7、第三方哪个SaZi写的代码,老子想砍人~~~

    8、下面是写的解决方法

    9、专此记录一下被坑,屌丝何必为难屌丝

    using System;
    using System.Collections.Generic;
    using System.Globalization;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    namespace StringToObject
    {
        public class XmlHelper
        {
            /// <summary>
            /// 将字符串解析为泛型对象List
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <param name="strData"></param>
            /// <returns></returns>
            public static List<T> GetObjectListFormString<T>(string strData)
            {
                List<T> output = new List<T>();
    
                strData = FormatString(strData);
                if (string.IsNullOrEmpty(strData)) return output;
    
                string[] stringArrar = Regex.Split(strData, "},{", RegexOptions.IgnoreCase);
    
                List<KeyValueClasss> targetObjectNameList = GetTNameList<T>();
    
                CompareInfo compare = CultureInfo.InvariantCulture.CompareInfo;
    
                stringArrar.ToList().ForEach(t =>
                {
                    targetObjectNameList.ForEach(l =>
                    {
                        l.Index = compare.IndexOf(t, l.Key, CompareOptions.IgnoreCase);
                    });
                    targetObjectNameList = targetObjectNameList.Where(l => l.Index != -1).OrderBy(l => l.Index).ToList();
    
                    for (int i = 0; i < targetObjectNameList.Count; i++)
                    {
                        if (i == 0)
                        {
                            string newValue = string.Empty;
                            if (targetObjectNameList.Count() <= 1)
                            {
                                newValue = t.Substring(targetObjectNameList[i].Key.Length);
                            }
                            else
                            {
                                int index = targetObjectNameList[i].Key.Length;
                                int size = targetObjectNameList[i + 1].Index - targetObjectNameList[i].Index - targetObjectNameList[i + 1].Key.Length - 1;
                                newValue = t.Substring(index, size);
                            }
                            newValue = newValue.Remove(0, 1);
                            newValue = newValue.Remove(newValue.Length - 1, 1);
                            targetObjectNameList[i].Value = newValue;
                        }
                        else if (i == targetObjectNameList.Count() - 1)
                        {
                            int index = targetObjectNameList[i].Index + targetObjectNameList[i].Key.Length;
                            targetObjectNameList[i].Value = t.Substring(index);
                            targetObjectNameList[i].Value = targetObjectNameList[i].Value.Remove(0, 1);
                        }
                        else
                        {
                            int index = targetObjectNameList[i].Index + targetObjectNameList[i].Key.Length;
                            int size = targetObjectNameList[i + 1].Index - targetObjectNameList[i].Index - targetObjectNameList[i].Key.Length;
                            string newValue = t.Substring(index, size);
                            newValue = newValue.Remove(0, 1);
                            newValue = newValue.Remove(newValue.Length - 1, 1);
                            targetObjectNameList[i].Value = newValue;
                        }
                    }
    
                    T newObject = System.Activator.CreateInstance<T>();
                    newObject.GetType().GetProperties().ToList().ForEach(o =>
                    {
                        var objValue = targetObjectNameList.Where(s => s.Key == o.Name).Select(s => s.Value).FirstOrDefault();
                        o.SetValue(newObject, objValue);
                    });
                    output.Add(newObject);
                });
    
                return output;
            }
            /// <summary>
            /// 获取对象属性名称列表
            /// </summary>
            /// <typeparam name="T"></typeparam>
            /// <returns></returns>
            private static List<KeyValueClasss> GetTNameList<T>()
            {
                var output = new List<KeyValueClasss>();
                var ropertyInfoArray = (typeof(T)).GetProperties();
                ropertyInfoArray.ToList().ForEach(t =>
                {
                    output.Add(new KeyValueClasss { Key = t.Name });
                });
                return output;
            }
            /// <summary>
            /// 过滤字符串
            /// </summary>
            /// <param name="strData"></param>
            /// <returns></returns>
            private static string FormatString(string strData)
            {
                if (string.IsNullOrEmpty(strData)) return string.Empty;
                ///过滤空格、换行符
                strData = strData.Replace("
    ", "").Replace(" ", "").Replace("	", "").Replace("
    ", "");
                ///去掉行首2字符 即"[{"
                strData = strData.Substring(2);
                ///去掉行尾2字符 即"}]"
                strData = strData.Substring(0, strData.Length - 2);
                return strData;
            }
        }
    
        /// <summary>
        /// 键值对类
        /// </summary>
        internal class KeyValueClasss
        {
            public string Key { get; set; }
            public int Index { get; set; }
            public string Value { get; set; }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Text.RegularExpressions;
    using System.Threading.Tasks;
    
    namespace StringToObject
    {
        class Program
        {
            static void Main(string[] args)
            {
                string strData = @"[{material_number=04.04.09.001.0398, material_model=WYD33W04-2200, qty=128, entry_id=frpbjbgpQheLY3CkGASZEiYEHMU=, material_name=浴霸2200W, totalReceiptQty=0}, {material_number=04.04.09.001.0399, material_model=WYD36W05-2200, qty=3332, entry_id=hTuWOEN2SAmasjdHve10syYEHMU=, material_name=浴霸2200W, totalReceiptQty=40}, {material_number=04.04.09.001.0400, material_model=WYD36W05-2400, qty=1000, entry_id=EUqVAulQQDidTA+N1RBQnSYEHMU=, material_name=浴霸2400W, totalReceiptQty=40}, {material_number=04.04.09.001.0401, material_model=WYD36W05-2600, qty=660, entry_id=D/NFnu3dTZGlzO16K6ThDSYEHMU=, material_name=浴霸2600W, totalReceiptQty=40}, {material_number=04.04.09.001.0407, material_model=WYD36W11-2600, qty=200, entry_id=Ut5TcbHCQc602ibG0na7tiYEHMU=, material_name=浴霸2600W, totalReceiptQty=40}, {material_number=04.04.09.001.0404, material_model=WYD36S08-1200, qty=1660, entry_id=YP/F0BgQT1+NA2QXEovgmSYEHMU=, material_name=浴霸1200W, totalReceiptQty=0}, {material_number=04.04.09.001.0405, material_model=WYD33X09-35, qty=300, entry_id=P6BSIaibSLeoNyRwafiBkiYEHMU=, material_name=凉霸35W, totalReceiptQty=0}, {material_number=04.04.09.001.0406, material_model=WYD33X10-40, qty=2000, entry_id=a+Yr0Ep8QWWPha7p36mmnSYEHMU=, material_name=换气扇40W, totalReceiptQty=0}]";
                //strData = @"[{
    
                //orderCustomerNnumber=01.008.0001, 
                //material_number=01.01.21.050.0579, 
                //material_model=T=0.3锰钢 表面:镀镍 26*10*8.5mm 图号:CMLS-MT5X06-009, 
                //qty=1500, 
                //orderCustomerName=华东零星客户, 
                //entry_id=6GBFaZ78TjikdC/OjvLwA8z9SSM=, 
                //material_name=挂板, 
                //shippedQty=1500
    
                //}, {orderCustomerNnumber=01.008.0001, material_number=01.02.12.001.0080, material_model=十字沉头4*20AN铁镀锌Rohs, qty=1500, orderCustomerName=华东零星客户, entry_id=E/u2J7tGR7m1zdz/tCKk4cz9SSM=, material_name=螺丝, shippedQty=1500}]";
    
                //strData = @"[{orderCustomerNnumber=01.008.0001, material_number=01.02.13.070.3045, material_model=10W光面球泡-商超版彩盒-6500K-350G灰底白板,尺寸62*62*115,WA2W21-10-886E-02-SC, qty=3000, orderCustomerName=华东零星客户, entry_id=jOgMCPN/TP2nY170m1XU8sz9SSM=, material_name=内盒, shippedQty=3000}]";
    
                List<TestClass> ttt = XmlHelper.GetObjectListFormString<TestClass>(strData);
    
                Console.WriteLine(strData);
                Console.ReadLine();
            }
        }
    
        public class TestClass
        {
            public string MATerial_number { get; set; }
            public string material_model { get; set; }
            public string qty { get; set; }
            //public string entry_id { get; set; }
            //public string material_name { get; set; }
            ////public string totalReceiptQty { get; set; }
    
            //public string orderCustomerNnumber { get; set; }
            //public string orderCustomerName { get; set; }
            //public string shippedQty { get; set; }
    
            //public string sadfsaf { get; set; }
        }
    }
  • 相关阅读:
    IP地址分类
    HTTP协议基础
    PHP中md5()函数绕过
    支付宝转账
    前端常用小工具
    防抖和节流
    分模块简单使用vuex
    vue-cli 2+antd定制主题
    浅谈Promise
    vue中用js实现文件上传和文件下载
  • 原文地址:https://www.cnblogs.com/eedc/p/9261463.html
Copyright © 2011-2022 走看看