没看到.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
}

这个只是给你一个方向,如果要用的话,需要修改符合自己的业务规则或者适合自己的使用。

出处:https://www.cnblogs.com/sliencer/archive/2013/06/25/3155768.html

c#:Json字符串转成xml对象的更多相关文章

  1. js中json字符串转成js对象

    json字符串转成js对象我所知的方法有2种: //json字符串转换成json对象 var str_json = "{name:'liuchuan'}"; //json字符串 / ...

  2. 解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG

    js 定义一个xml 对象,var data = "<Root><DataRow Id=\"1234\"/></Root>" ...

  3. 将String类型的json字符串转换成java对象

    1,import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); Mycl ...

  4. json字符串转换成java对象

  5. java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...

    @RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...

  6. java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据

    引入依赖 <dependency>    <groupId>com.alibaba</groupId>    <artifactId>fastjson& ...

  7. json 字符串转换成对象,对象转换成json字符串

    json   字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法:   [注意jquery版本问题] var str = '{"name":&qu ...

  8. Java对象转换成xml对象和Java对象转换成JSON对象

    1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...

  9. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值

    一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...

随机推荐

  1. Arthur and Brackets

    n<605设计出n对夸号  给出n个条件每个条件为[l,r] 表示第i对夸号右夸号离左夸号的距离,然后夸号的右夸号出现的顺序必须按照给的顺序 出现, 那么如果存在就输出否则输出impossilb ...

  2. Java 强引用、软引用、弱引用、幻象引用有什么区别

    1)引用出现的根源 引用出现的根源是由于GC内存回收的基本原理.GC回收本质上是回收对象.目前比较流行的回收算法是可达性分析算法.从GC roots开始安装一定的逻辑判断一个对象是否可达,不可达的话就 ...

  3. Maven聚合项目在eclipse中显示没有层次

    大部分时间都在用idea做maven的项目,今天用eclipse导入了maven项目,果然不出所料,界面有显示问题,各个模块都堆叠在同一层级,根本看不出父项目与子项目之间的层次关系,见下图: 于是找修 ...

  4. Python3基础 print(,end=) 输出内容的末尾加入空格

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  5. 【重新挂载磁盘空间】Linux系统/home的磁盘空间重新挂载给/root

    以下是在centos7版本上做测试 使用如下命令查看磁盘使用情况 ls -lh 文件系统 容量 已用 可用 已用% 挂载点 devtmpfs 3.9G 0 3.9G 0% /dev tmpfs 3.9 ...

  6. SpringBoot使用Redis数据库

    (1)pom.xml文件引入jar包,如下: <dependency> <groupId>org.springframework.boot</groupId> &l ...

  7. 安装基础版的kinetic

    没有gui工具 sudo apt-get install ros-kinetic-ros-base

  8. 经典线程同步问题(生产者&消费者)--Java实现

    生产者-消费者(producer-consumer)问题是一个著名的线程同步问题.它描述的是:有一群生产者线程在生产产品,并将这些产品提供给消费者线程去消费. 为使生产者与消费者之间能够并发执行,在两 ...

  9. YAML(摘录)

    YAML:维基百科 一个用来表达数据序列的格式.强调以数据为中心的标记语言. 使用空白符缩进和大量依赖外观的特殊,适合编辑数据结构,配置文件. 基本格式: 缩进/区块 和内置两者格式,来表示array ...

  10. Web开发中常用的定位布局position

    定位布局就是为开发提供了更好的布局方式,可以根据需求给相应的模块设定相应位置,从而使界面更佳丰富,代码更佳完美. position是CSS中非常重要的一个属性,通过position属性,我们可以让元素 ...