将Web客户端的字符串响应转换为数组/列表

本文关键字:数组 列表 转换 响应 Web 客户端 字符串 | 更新日期: 2023-09-27 18:29:50

我从Web客户端收到以下字符串,我想将其转换为数组、列表或xml文档,以便对其进行迭代。我曾尝试转换为Linq.XDocument.Parse(strResponse),但失败并返回错误:根级别的数据无效。第1行,位置1。

转换:

String strResponse = Encoding.UTF8.GetString( response );
XDocument xmldoc = XDocument.Parse( strResponse );

上面的strResponse看起来像:

array(3) {
    [0]=>
      array(5) {
        ["brand"]=>
        string(6) "Abarth"
        ["range"]=>
        string(3) "500"
        ["model"]=>
        string(8) "500 1.4T"
        ["mm_code"]=>
        string(8) "00815150"
        ["intro_date"]=>
        string(10) "2012-01-12"
      }
      [1]=>
      array(5) {
        ["brand"]=>
        string(6) "Abarth"
        ["range"]=>
        string(3) "500"
        ["model"]=>
        string(17) "500 1.4T esseesse"
        ["mm_code"]=>
        string(9) "008151501"
        ["intro_date"]=>
        string(10) "2012-01-12"
      }
      [2]=>
      array(5) {
        ["brand"]=>
        string(6) "Abarth"
        ["range"]=>
        string(3) "500"
        ["model"]=>
        string(9) "500C 1.4T"
        ["mm_code"]=>
        string(8) "00815180"
        ["intro_date"]=>
        string(10) "2012-01-12"
      }
  }

当我试图将上面的响应转换为xml文档时,有人能理解为什么会出现错误吗?有什么更好的建议吗?

提前谢谢。

将Web客户端的字符串响应转换为数组/列表

这看起来像JSON而不是XML,您可以尝试JSON序列化程序

您的响应是PHP数组
您可以使用Regex或其他逻辑编写自己的转换器
或者使用一些第三部分库,例如Conversive.PHPSerializationLibrary

这里有一个非常基本的解析器,可以与文本一起使用

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication1
{
    class Program
    {
        const string FILENAME = @"c:'temp'test.txt";
        static void Main(string[] args)
        {
            Parse parse = new Parse(FILENAME);
            List<object> results = parse.Recursion();
        }
    }
    public class Parse
    {
        enum State
        {
            NOTHING,
            GET_NAME,
            GET_VALUE
        }
        static StreamReader reader = null;
        public Parse(string filename)
        {
            reader = new StreamReader(filename);
        }
        public List<object> Recursion()
        {
            List<object> results = new List<object>();
            char[] chr = new  char[1];
            State state = State.NOTHING;
            Boolean exit = false;
            Boolean openDoubleQuote = false;
            string name = "";
            string value = "";
            while(reader.Read(chr, 0, 1) == 1)
            {
                switch (state)
                {
                    case State.NOTHING :
                        switch(chr[0])
                        {
                            case '{' :
                                results.Add(Recursion());                     
                                break;
                            case ''"':
                                state = State.GET_NAME;
                                openDoubleQuote = true;
                                break;
                        }
                        break;
                    case State.GET_NAME:
                        switch(chr[0])
                        {
                            case ''"' :
                                if (openDoubleQuote == false)
                                {
                                    openDoubleQuote = true;
                                }
                                else
                                {
                                    state = State.GET_VALUE;
                                    openDoubleQuote = false;
                                }
                                break;
                            case '}' :
                                exit = true;
                                break;
                            default : 
                                if (openDoubleQuote == true)
                                {
                                    name += chr[0];
                                }
                                break;
                        }
                        break;
                    case State.GET_VALUE:
                        switch(chr[0])
                        {
                            case ''"' :
                                if (openDoubleQuote == false)
                                {
                                    openDoubleQuote = true;
                                }
                                else
                                {
                                    KeyValuePair<string, string> pair = new KeyValuePair<string, string>(name, value);
                                    results.Add(pair);
                                    name = "";
                                    value = "";
                                    state = State.GET_NAME;
                                    openDoubleQuote = false;
                                }
                                break;
                            default :
                            if (openDoubleQuote == true)
                            {
                                value += chr[0];
                            }
                            break;
                        }
                        break;
                }
                if (exit) break;
            }
            return results;
        }
    }
}