被坑记之:从拼接字符串中将对象解析出来

2018/07/04 04:57
阅读数 7

描述下背景:目前做一个项目,需要对接第三方提供的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("\n", "").Replace(" ", "").Replace("\t", "").Replace("\r", "");
            ///去掉行首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; }
    }
}

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部