描述下背景:目前做一个项目,需要对接第三方提供的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; }
}
}