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
}
这个只是给你一个方向,如果要用的话,需要修改符合自己的业务规则或者适合自己的使用。
出处:https://www.cnblogs.com/sliencer/archive/2013/06/25/3155768.html
c#:Json字符串转成xml对象的更多相关文章
- js中json字符串转成js对象
json字符串转成js对象我所知的方法有2种: //json字符串转换成json对象 var str_json = "{name:'liuchuan'}"; //json字符串 / ...
- 解决JQUERY在IE8,7,6下将字符串转成XML对象时产生的BUG
js 定义一个xml 对象,var data = "<Root><DataRow Id=\"1234\"/></Root>" ...
- 将String类型的json字符串转换成java对象
1,import com.fasterxml.jackson.databind.ObjectMapper; ObjectMapper mapper = new ObjectMapper(); Mycl ...
- json字符串转换成java对象
- java 字符串转json,json转实体对象、json字符串转换成List、List转String、以及List排序等等...
@RequestMapping(value = "updateInvestorApplyAccountNo", method = RequestMethod.POST) @Resp ...
- java操作JSON字符串转换成对象的时候如何可以不建立实体类也能获取数据
引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson& ...
- json 字符串转换成对象,对象转换成json字符串
json 字符串转换成对象,对象转换成json字符串 前端: 方法一: parseJSON方法: [注意jquery版本问题] var str = '{"name":&qu ...
- Java对象转换成xml对象和Java对象转换成JSON对象
1.把Java对象转换成JSON对象 apache提供的json-lib小工具,它可以方便的使用Java语言来创建JSON字符串.也可以把JavaBean转换成JSON字符串. json-lib的核心 ...
- json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值
一.json相关概念 json,全称为javascript object notation,是一种轻量级的数据交互格式.采用完全独立于语言的文本格式,是一种理想的数据交换格式. 同时,json是jav ...
随机推荐
- PHP中使用OpenSSL下openssl_verify验证签名案例
使用OpenSSL那么需要先了解一下http://www.cnblogs.com/wt645631686/p/8390936.html <?php //demo $json = '{" ...
- linux内核分析第五周-分析system_call中断处理过程
本实验目的:通过以一个简单的menu小程序,跟踪系统调用的过程,分析与总结系统调用的机制和三层进入的过程. 实验原理:系统调用处理过程与中断处理的机制 系统调用是通过软中断指令 INT 0x80 实现 ...
- 51nod 1289 大鱼吃小鱼
#include<bits/stdc++.h> using namespace std; ; int a[maxn],b[maxn]; stack<int>s; int mai ...
- 记我一年的OI之路
upd:感觉没必要设密码了吧,把这个发出来还能显得自己弱颓一些.. 自从我刚刚接触c++,到现在已经快一年了吧,这一年中,我学到了很多,失去了很多,也得到了很多. 开通了blog,那就从现在,就是一个 ...
- UVa 11270 铺放骨牌(轮廓线DP)
https://vjudge.net/problem/UVA-11270 题意: 用1×2骨牌覆盖n×m棋牌,有多少种方法? 思路: 这道题目是典型的轮廓线DP题. 所谓轮廓线DP,就是以整行整列为状 ...
- tfn2k工具使用介绍
主要介绍tfn2k(Linux),因为它最著名嘛!主要分为使用说明 然后在说安装所以有点长 (注意:有的人拿VPS来做DDOS·问题是有的人发现了会关闭你VPS的·除非你认识他或者你自己有服务器而不是 ...
- Linux CentOS7.0下JAVA安装和配置环境变量
一.前言: CentOS7.0虽然自带JDK1.7和1.8,运行“java -version”命令也可以看到版本信息,但是jdk的安装环境不全,比如缺少tool.jar和dt.jar等,这就导致“ja ...
- html5 自带全屏API调用方法
function FullScreen(){ var el = $('html')[0];//要全屏的元素,如果要全页面全屏,建议使用html节点而不是body节点 var isFullscreen= ...
- POJ3279 搜索/思维
Fliptile Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10457 Accepted: 3866 Descrip ...
- Swagger使用总结(十九)
1. Swagger是什么? Swagger 是一款RESTFUL接口的文档在线自动生成+功能测试功能软件. 官方说法:Swagger是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTfu ...