c#: 解析json, 转成xml, 简单方便
没看到.net framework中有这样的功能, 懒得到处找了, 索性花点时间自己写一个
/*
* Created by SharpDevelop.
* Date: 2013/6/24
* User: sliencer
* Time: 21:54
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Xml; namespace JsonDecoder
{
class Program
{
public static void Main(string[] args)
{
int i=;
foreach (String element in inputs) {
JS_Value v=JsonDecoder.Decode(element);
if (v == null)
throw Error.InvalidJsonStream;
String s=v.ToString();
XmlWriterSettings settings =new XmlWriterSettings();
settings.Indent = true;
settings.Encoding = Encoding.UTF8;
XmlWriter wri = XmlWriter.Create("Output" + (i++) + ".xml", settings);
v.ToXml(wri, true, "JSon");
wri.Close();
}
}
static String[] inputs=new string[]{
/*自己找几个json测试一下, 我的是从网站随便找来的, 担心版权问题, 就去掉了*/
@"""test1""", @"""test2""", @"""test3"""
};
}
public abstract class JS_Value
{
public abstract void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName);
}
public static class XmlHelper
{
public static String ToValidXmlName(String p_name)
{
/*
* http://www.w3.org/TR/REC-xml/#NT-Name
NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF]
NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
*/
string patNameStartChar = @":|[A-Z]|_|[a-z]|[\xC0-\xD6]|[\xD8-\xF6]|[\xF8-\u02FF]|[\u0370-\u037D]|[\u037F-\u1FFF]|[\u200C-\u200D]|[\u2070-\u218F]|[\u2C00-\u2FEF]|[\u3001-\uD7FF]|[\uF900-\uFDCF]|[\uFDF0-\uFFFD]";
string patNameChar = patNameStartChar +"|" + @"-|\.|[0-9]|\xB7|[\u0300-\u036F]|[\u203F-\u2040]";
String pat=@"^(" + patNameStartChar + ")" + "(" + patNameChar + ")*$";
if (Regex.Match(p_name, pat, RegexOptions.Singleline).Success)
return p_name;
else
{
StringBuilder bld=new StringBuilder();
for (int i=;i<p_name.Length;i++)
{
bool bMatch=false;
if (i==)
bMatch = Regex.Match(p_name[i].ToString(), patNameStartChar, RegexOptions.Singleline).Success;
else
bMatch = Regex.Match(p_name[i].ToString(), patNameChar, RegexOptions.Singleline).Success;
if(bMatch)
bld.Append(p_name[i]);
else
bld.AppendFormat("_x{0:x}_", (int)p_name[i]);
}
return bld.ToString();
}
}
public static void WriteStartElement_auto(this XmlWriter wri, String p_strName)
{
if (p_strName.Contains(":"))
{
String prefix=p_strName.Substring(, p_strName.LastIndexOf(':'));
string localName=p_strName.Substring(p_strName.LastIndexOf(':')+);
if(String.IsNullOrEmpty(localName))
{
localName = p_strName.Substring(, p_strName.Length-);
prefix = "";
}
wri.WriteStartElement(localName, prefix);
} else
wri.WriteStartElement(p_strName);
}
}
public class JS_String : JS_Value
{
public String RawValue{get;set;}
public String Value{get;set;}
public override string ToString()
{
return RawValue;
}
public override void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName)
{
String strEleName=XmlHelper.ToValidXmlName(String.IsNullOrEmpty(p_strElementName)? "Value" : p_strElementName);
if (p_bCreateElement)
{
p_wri.WriteStartElement_auto(strEleName);
}
p_wri.WriteAttributeString("type", "string");
p_wri.WriteString(Value);
if (p_bCreateElement)
{
p_wri.WriteEndElement();
}
}//ToXml()
}//class
public class JS_Number: JS_Value
{
public String Number{get;set;}
public override string ToString()
{
return Number;
} public override void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName)
{
String strEleName=XmlHelper.ToValidXmlName(String.IsNullOrEmpty(p_strElementName)? "Value" : p_strElementName);
if (p_bCreateElement)
{
p_wri.WriteStartElement_auto(strEleName);
}
p_wri.WriteAttributeString("type", "number");
p_wri.WriteString(Number);
if (p_bCreateElement)
{
p_wri.WriteEndElement();
}
}
}
public class JS_Object: JS_Value
{
private Dictionary<String, JS_Value> m_properties=new Dictionary<String, JS_Value> ();
public Dictionary<String, JS_Value> Properties{
get{
return m_properties;
}
}
public override string ToString()
{
if(m_properties.Count<=)
return "{}";
else
return "{" + m_properties.Select(x=>"\"" + x.Key + "\":" + x.Value.ToString())
.Aggregate((x,y)=> x + ",\r\n" +y ) +"}";
} public override void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName)
{
String strEleName=XmlHelper.ToValidXmlName(String.IsNullOrEmpty(p_strElementName)? "Value" : p_strElementName);
if (p_bCreateElement)
{
p_wri.WriteStartElement_auto(strEleName);
}
p_wri.WriteAttributeString("type", "object");
foreach (String properName in m_properties.Keys) {
m_properties[properName].ToXml(p_wri, true, properName);
}
if (p_bCreateElement)
{
p_wri.WriteEndElement();
}
}
}//class JS_Obj
public class JS_Array : JS_Value
{
private List<JS_Value> m_elements=new List<JS_Value>();
public List<JS_Value> Elements{
get{
return m_elements;
}
}
public override string ToString()
{
if(m_elements.Count<=)
return "[]";
else
return "[" + m_elements.Select(x=>x.ToString()).Aggregate((x,y)=> x + ",\r\n" +y ) +"]";
} public override void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName)
{
String strEleName="Value";
if (p_bCreateElement)
{
p_wri.WriteStartElement_auto(strEleName);
}
p_wri.WriteAttributeString("type", "array");
foreach (JS_Value element in m_elements) {
element.ToXml(p_wri, true, p_strElementName);
}
if (p_bCreateElement)
{
p_wri.WriteEndElement();
}
}
}
public enum enumJSConst{
eTrue, eFalse,eNull
}
public class JS_Const : JS_Value
{
public JS_Const(enumJSConst val){ m_value = val;}
private enumJSConst m_value;
public enumJSConst Value{get{return m_value;}} public override string ToString()
{
return m_value.ToString().Substring().ToLower();
}
public override void ToXml(XmlWriter p_wri, bool p_bCreateElement, String p_strElementName)
{
String strEleName=XmlHelper.ToValidXmlName(String.IsNullOrEmpty(p_strElementName)? "Value" : p_strElementName);
if (p_bCreateElement)
{
p_wri.WriteStartElement_auto(strEleName);
}
p_wri.WriteAttributeString("type", "const");
p_wri.WriteString(ToString());
if (p_bCreateElement)
{
p_wri.WriteEndElement();
}
} public static JS_Const True = new JS_Const(enumJSConst.eTrue);
public static JS_Const False = new JS_Const(enumJSConst.eFalse);
public static JS_Const Null = new JS_Const(enumJSConst.eNull); }
public class JsonDecoder
{
public static JS_Value Decode(String p_stream)
{
if (String.IsNullOrWhiteSpace(p_stream))
return null;
else
{
String s=p_stream.Trim();
int nPos=;
JS_Value v= GetValue(s, ref nPos);
if (nPos == s.Length)
return v;
else
throw Error.InvalidJsonStream;
}
}
private static char NextChar(String p_stream, ref int p_currentPos)
{
if (p_currentPos>=p_stream.Length)
throw Error.InvalidJsonStream;
return p_stream[p_currentPos++];
}
private static void SkipSpaces(String p_stream, ref int p_currentPos)
{
while (p_currentPos<p_stream.Length
&& (Char.IsWhiteSpace(p_stream[p_currentPos])
/* || Char.IsControl(p_stream[p_currentPos])*/
)
)
{
p_currentPos++;
}//while }
private static char PeekChar(String p_stream, int p_currentPos)
{
if (p_currentPos>=p_stream.Length)
throw Error.InvalidJsonStream;
return p_stream[p_currentPos];
}
public static JS_Value GetValue(String p_stream, ref int p_currentPos)
{
JS_Value newValue=GetConst(p_stream, ref p_currentPos);
if (null == newValue)
newValue = GetString(p_stream, ref p_currentPos);
if (null == newValue)
newValue = GetNumber(p_stream, ref p_currentPos);
if (null == newValue)
newValue = GetObject(p_stream, ref p_currentPos);
if (null == newValue)
newValue = GetArray(p_stream, ref p_currentPos); if(null == newValue)
throw Error.InvalidJsonStream;
return newValue;
}
public static JS_Number GetNumber(String p_stream, ref int p_currentPos)
{
int nLen = p_stream.Length;
if (p_currentPos>=nLen)
return null;
String strFraction=@"\.[0-9]+";
String strExposion=@"[eE][+-]?[0-9]+";
String strPattern=@"^(\-)?[1-9][0-9]*(" + strFraction +")?(" + strExposion + ")?";
// if(p_stream.Substring(p_currentPos).StartsWith("500"))
// Console.WriteLine("Here");
Regex rex=new Regex(strPattern);
Match m= rex.Match(p_stream.Substring(p_currentPos));
if (!m.Success) {
/*m = Regex.Match(p_stream.Substring(p_currentPos), strPattern);
m = Regex.Match(p_stream.Substring(p_currentPos), @"^-?[1-9][0-9]*");
m = Regex.Match(p_stream.Substring(p_currentPos), @"^\-?[1-9][0-9]*");
m = Regex.Match(p_stream.Substring(p_currentPos), @"^(-)?[1-9][0-9]*");
m = Regex.Match(p_stream.Substring(p_currentPos), @"^(\-)?[1-9][0-9]*");
*/
return null;
}
JS_Number result=new JS_Number();
result.Number = p_stream.Substring(p_currentPos, m.Groups[].Length);
p_currentPos += m.Groups[].Length;
return result;
}
public static JS_Const GetConst(String p_stream, ref int p_currentPos)
{
int nLen = p_stream.Length;
if (p_currentPos>=nLen)
return null;
string temp=p_stream.Substring(p_currentPos);
if (temp.StartsWith("true", StringComparison.CurrentCultureIgnoreCase))
{
p_currentPos+=;
return JS_Const.True;
}
if (temp.StartsWith("false", StringComparison.CurrentCultureIgnoreCase))
{
p_currentPos+=;
return JS_Const.False;
}
if (temp.StartsWith("null", StringComparison.CurrentCultureIgnoreCase))
{
p_currentPos+=;
return JS_Const.Null;
}
return null;
}
public static JS_Array GetArray(String p_stream, ref int p_currentPos)
{
int nLen = p_stream.Length;
if (p_currentPos>=nLen)
return null;
int nCurrent=p_currentPos;
if (PeekChar(p_stream, nCurrent) != '[')
return null;
nCurrent++;
JS_Array result=new JS_Array();
SkipSpaces(p_stream, ref nCurrent);
while(nCurrent<=nLen)
{
int c=PeekChar(p_stream,nCurrent);
if (c==']')
{
nCurrent++;
break;
}
bool noMorePairs=false;
while(!noMorePairs)
{
JS_Value propertyValue=GetValue(p_stream, ref nCurrent);
result.Elements.Add(propertyValue);
SkipSpaces(p_stream, ref nCurrent);
if (PeekChar(p_stream, nCurrent) != ',')
noMorePairs=true;
else
{
nCurrent++;
SkipSpaces(p_stream, ref nCurrent);
}
}//inner while
}//outter while
p_currentPos=nCurrent;
return result;
}
public static JS_Object GetObject(String p_stream, ref int p_currentPos)
{
int nLen = p_stream.Length;
if (p_currentPos>=nLen)
return null;
int nCurrent=p_currentPos;
if (PeekChar(p_stream, nCurrent) != '{')
return null;
nCurrent++;
JS_Object result=new JS_Object();
SkipSpaces(p_stream, ref nCurrent);
while(nCurrent<=nLen)
{
int c=PeekChar(p_stream,nCurrent);
if (c=='}')
{
nCurrent++;
break;
}
bool noMorePairs=false;
while(!noMorePairs)
{
JS_String propertyName=GetString(p_stream, ref nCurrent);
SkipSpaces(p_stream, ref nCurrent);
Char c1 =NextChar(p_stream,ref nCurrent);
if (c1!=':')
throw Error.InvalidJsonStream;
SkipSpaces(p_stream, ref nCurrent);
JS_Value propertyValue=GetValue(p_stream, ref nCurrent);
result.Properties.Add(propertyName.Value, propertyValue);
SkipSpaces(p_stream, ref nCurrent);
if (PeekChar(p_stream, nCurrent) != ',')
noMorePairs=true;
else
{
nCurrent++;
SkipSpaces(p_stream, ref nCurrent);
}
}//inner while
}//outter while
p_currentPos=nCurrent;
return result;
}
public static JS_String GetString(String p_stream, ref int p_currentPos)
{
int nLen = p_stream.Length;
if (p_currentPos>=nLen)
return null;
JS_String result=new JS_String();
int nCurrent=p_currentPos;
if (PeekChar(p_stream, nCurrent) != '"')
return null;
nCurrent++;
StringBuilder bld=new StringBuilder();
while(nCurrent<=nLen)
{
Char c=p_stream[nCurrent++];
if (c=='"')
break;
if (c != '\\')
{
bld.Append(c);
continue;
}
c = NextChar(p_stream, ref nCurrent);
if (c=='"')
bld.Append('"');
else if (c == '\\')
bld.Append('\\');
else if (c == '/')
bld.Append('/');
else if (c == 'b')
bld.Append('\b');
else if (c == 't')
bld.Append('\t');
else if (c == 'r')
bld.Append('\r');
else if (c == 'n')
bld.Append('\n');
else if (c == 'f')
bld.Append('\f');
else if (c == 'u')
{
char[] code=new Char[];
code[]=NextChar(p_stream, ref nCurrent);
code[]=NextChar(p_stream, ref nCurrent);
code[]=NextChar(p_stream, ref nCurrent);
code[]=NextChar(p_stream, ref nCurrent);
int nCodePoint=Int32.Parse(code.ToString(), NumberStyles.HexNumber);
bld.Append((char)nCodePoint);
}
}//while()
result.Value = bld.ToString();
result.RawValue = p_stream.Substring(p_currentPos, nCurrent-p_currentPos);
p_currentPos=nCurrent;
return result;
} } //class JsonDecoder
public static class Error{
public static Exception InvalidJsonStream
{
get
{
return new Exception("Invalid Json Stream");
}
}
}//class Error
}
c#: 解析json, 转成xml, 简单方便的更多相关文章
- ANTLR4将JSON翻译成XML
实现功能:构建一个JSON到XML的翻译器. antlr4文件: grammar JSON; json : object | array ; object : '{' pair (',' pair)* ...
- 【Android进阶】Gson解析json字符串的简单应用
在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...
- 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?
前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...
- Android 手机卫士--解析json与消息机制发送不同类型消息
本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址. 1.解析json数据 解析json的代码很简单 JSONObject jso ...
- 解析Json的谷歌官方方法Gson和阿里巴巴的fastJson方法。
//测试单个json文本 public void testGsonTwo(){ String jsonStr = "{\"id\":100,\"name\&qu ...
- Google官方网络框架-Volley的使用解析Json以及加载网络图片方法
Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...
- Dreamer2.1 发布 新增将Bean解析成xml和json
一个上午,增加两个功能 1.直接将对象解析成XML 2.将对象解析成JSON 对象可以是数组,可以是集合,也可以是单个对象 源码和jar下载地址:http://pan.baidu.com/share/ ...
- UI进阶 解析XML 解析JSON
1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSO ...
- (转)解析json xml
JSON数据 {"videos":[{"id":1,"image":"resources/images/minion_01.png ...
- Cocos2d-x 3.0 Json用法 Cocos2d-x xml解析
Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidj ...
随机推荐
- HTTP POST GET 区别
一 原理区别 一般在浏览器中输入网址访问资源都是通过GET方式:在FORM提交中,可以通过Method指定提交方式为GET或者POST,默认为GET提交 Http定义了与服务器交互的不同方法,最基本的 ...
- c++中的隐藏、重载、覆盖(重写)
转自c++中的隐藏.重载.覆盖(重写) 1 重载与覆盖 成员函数被重载的特征: (1)相同的范围(在同一个类中): (2)函数名字相同: (3)参数不同: (4)virtual关键字可有可无. 覆盖是 ...
- Tiny6410 设备驱动之helloworld
在自己的工作目录下建立helloworld_driver.c #include <linux/init.h> #include <linux/module.h> //代码遵守的 ...
- 修改MYSQL数据库表的字符集
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- linux mysql数据库安装(tar.gz)
概述 mysql数据库在linux下可以充分发挥威力,mysql数据库越来越受到软件公司的青睐,为什么呢? 免费.跨平台.轻.支持多并发 在北京很多软件公司属于创业型的中.小公司,从节约成本的角度考虑 ...
- 在RedHat5.4 LINUX 安装mySQL数据库
linux下mysql 最新版安装图解教程 1. 查看当前安装的linux版本 通过上图中的数据可以看出安装的版本为RedHat5.4,所以我们需要下载RedHat5.4对应的mysql安装包
- Git管理unity3d项目
如果小组中没有足够的专业版license,用不了unity3d自带的version control,可以使用git来对项目进行版本控制:只不过需要建一个.gitignore文件在git项目管理的根目录 ...
- java 转换 小函数(不断增加中。。。)
//char数组转换成byte数组 private byte[] getBytes (char[] chars) { Charset cs = Charset.forName ("UTF-8 ...
- Android 动态Tab分页效果
当前项目使用的是TabHost+Activity进行分页,目前要做个报表功能,需要在一个Tab页内进行Activity的切换.比方说我有4 个Tab页分别为Tab1,Tab2,Tab3,Tab4,现在 ...
- strcpy函数的C/C++实现
2013-07-05 14:07:49 本函数给出了几种strcpy与strncpy的实现,有ugly implementation,也有good implementation.并参考标准库中的imp ...