没看到.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, 简单方便的更多相关文章

  1. ANTLR4将JSON翻译成XML

    实现功能:构建一个JSON到XML的翻译器. antlr4文件: grammar JSON; json : object | array ; object : '{' pair (',' pair)* ...

  2. 【Android进阶】Gson解析json字符串的简单应用

    在客户端与服务器之间进行数据传输,一般采用两种数据格式,一种是xml,一种是json.这两种数据交换形式各有千秋,比如使用json数据格式,数据量会比较小,传输速度快,放便解析,而采用xml数据格式, ...

  3. 怎样用Google APIs和Google的应用系统进行集成(5)----怎样把Google Tasks的JSON Schema转换成XML的Schema(XSD)?

    前面说了一些Google API的介绍,可是在实际的开发其中,我们可能须要把Google RESTful API返回的JSON数据转换成XML数据输入到第三方系统,这在企业应用集成里面很的常见. 那么 ...

  4. Android 手机卫士--解析json与消息机制发送不同类型消息

    本文地址:http://www.cnblogs.com/wuyudong/p/5900800.html,转载请注明源地址. 1.解析json数据 解析json的代码很简单 JSONObject jso ...

  5. 解析Json的谷歌官方方法Gson和阿里巴巴的fastJson方法。

    //测试单个json文本 public void testGsonTwo(){ String jsonStr = "{\"id\":100,\"name\&qu ...

  6. Google官方网络框架-Volley的使用解析Json以及加载网络图片方法

    Google官方网络框架-Volley的使用解析Json以及加载网络图片方法 Volley是什么? Google I/O 大会上,Google 推出 Volley的一个网络框架 Volley适合什么场 ...

  7. Dreamer2.1 发布 新增将Bean解析成xml和json

    一个上午,增加两个功能 1.直接将对象解析成XML 2.将对象解析成JSON 对象可以是数组,可以是集合,也可以是单个对象 源码和jar下载地址:http://pan.baidu.com/share/ ...

  8. UI进阶 解析XML 解析JSON

    1.数据解析 解析的基本概念 所谓“解析”:从事先规定好的格式中提取数据 解析的前提:提前约定好格式,数据提供方按照格式提供数据.数据获取方则按照格式获取数据 iOS开发常见的解析:XML解析.JSO ...

  9. (转)解析json xml

    JSON数据 {"videos":[{"id":1,"image":"resources/images/minion_01.png ...

  10. Cocos2d-x 3.0 Json用法 Cocos2d-x xml解析

    Cocos2d-x 3.0 加入了rapidjson库用于json解析.位于external/json下. rapidjson 项目地址:http://code.google.com/p/rapidj ...

随机推荐

  1. Xcode 合并分支报错

    原理和操作步骤见如下转载的两篇文章, 我所使用的 svn 客户端软件是 Mac 下面的 Versions.app v1.06 这个版本包含一个多人开发的bug bug 的解决方案见我之前转载的两篇文章 ...

  2. vs中使用过的扩展和好的nuget库

    扩展 ReAttach ReAttach gives you an easy way to ReAttaching your prior debug targets. ReAttach stores ...

  3. Recommender Systems引言

    我想站在大神肩膀上...貌似是计算所的一个小伙伴... 总结的很好,看得出来有一定的功底.... 不过对于自己看过了的东西,就不愿意再翻看第二遍了.恰好这本书和项亮那本很像,就直接看这本书了.顺便记记 ...

  4. uva 10780

    曾经做过一个类似的  求n!中有多少个质因子m 这里有一个结论 k = n/m+n/(m^2)+n/(m^3)+.... int getnum(int n, int m) { int sum = 0; ...

  5. uva 10791

    还算比较水的一个数学题 求因子的最小和  总是用小的数去除   注意特判  是用int不行哦........ #include <cstdio> #include <cmath> ...

  6. 时序列数据库武斗大会之 TSDB 名录 Part 1

    [编者按] 刘斌,OneAPM后端研发工程师,拥有10多年编程经验,参与过大型金融.通信以及Android手机操作系的开发,熟悉Linux及后台开发技术.曾参与翻译过<第一本Docker书> ...

  7. 论MOBA类游戏五号位的重要性

    观众朋友们,也许你对题目很好奇,才打开这篇文章.为什么技术圈中会出现游戏类的软文?如果时间充足,可以继续往下看. MOBA 类游戏的兴起,逐渐吞噬游戏市场,以病毒式的扩张方式肆意改变着游戏玩家内心对游 ...

  8. Docker 监控实战

    如今,越来越多的公司开始使用 Docker 了,现在来给大家看几组数据: 2 / 3 的公司在尝试了 Docker 后最终使用了它 也就是说 Docker 的转化率达到了 67%,而转化市场也控制在 ...

  9. Linux下去掉^M的方法

    cat -A filename 就可以看到windows下的断元字符 ^M 要去除他,最简单用下面的命令: dos2unix filename     第二种方法:   sed -i 's/^M//g ...

  10. Java发送post请求

    package com.baoxiu.test; import java.io.BufferedReader;import java.io.InputStreamReader;import java. ...