Json对象转换模块(自编代码JsonObject.cs)
namespace 信息采集系统.Common
{
/// <summary>
/// Json类型对象,用于其它Json对象继承
/// </summary>
/// <typeparam name="T">自定义类型</typeparam>
[DataContract]
public abstract class JsonObject<T>
{
/// <summary>
/// 将Json对象转换为字节数组
/// </summary>
/// <returns></returns>
public byte[] ToArray()
{
var serializer = new DataContractJsonSerializer(this.GetType());
using (var ms = new MemoryStream())
{
serializer.WriteObject(ms, this);
var b = ms.ToArray();
return b;
}
}
/// <summary>
/// 将Json对象转换为字符串
/// </summary>
/// <returns></returns>
public override string ToString()
{
var b = this.ToArray();
var s = Encoding.UTF8.GetString(b);
return s;
}
/// <summary>
/// 将Json对象转换为字符串,并进行格式化输出
/// </summary>
/// <returns>利于阅读的Json字符串</returns>
public string ToFriendlyString()
{
return this.toFriendlyString(this, 0);
}
private string toFriendlyString(object obj, int level)
{
var sbAll = new StringBuilder();
var type = obj.GetType();
var interfaces = type.GetInterfaces();
if (interfaces.Contains(typeof(System.Collections.IList)))
{
var arr = obj as System.Collections.IList;
var sbLine = new StringBuilder();
sbLine.Append($"\r\n{makeMultiSymbol(level)}[\r\n");
sbAll.Append(sbLine.ToString());
for (int i = 0; i < arr.Count; i++)
{
var item = arr[i];
string line = this.toFriendlyString(item, level + 1);
sbAll.Append(line); if (i < arr.Count - 1)
sbAll.Append(",\r\n");
else
sbAll.Append("\r\n");
}
sbLine = new StringBuilder();
sbLine.Append($"{makeMultiSymbol(level)}]");
sbAll.Append(sbLine.ToString());
}
else
{
var sbLine = new StringBuilder();
sbLine.Append($"{makeMultiSymbol(level)}{{\r\n");
sbAll.Append(sbLine.ToString());
var dict = new Dictionary<int, string[]>();
var fields = type.GetFields(); for (int i = 0; i < fields.Length; i++)
{
var field = fields[i];
var atts = field.GetCustomAttributes(true);
var att = atts.FirstOrDefault(x => x is DataMemberAttribute);
if (att == null) continue;
var order = (att as DataMemberAttribute).Order;
var name = field.Name;
var value = field.GetValue(obj);
sbLine = new StringBuilder();
string strValue;
if (value == null)
strValue = "null";
else
{
var attrType = value.GetType();
if (attrType.IsEnum)
strValue = ((int)value).ToString();
else if (attrType == typeof(string))
strValue = StringExt.ToCodeFormat(value as string);
else if (attrType.IsValueType)
strValue = value.ToString();
else
strValue = this.toFriendlyString(value, level + 1);
}
if (dict.Values.Count(x => x[0] == name) == 0)
{
if (order == -1) order = GetNextOrderID(dict);
dict.Add(order, new string[] { name, strValue });
}
} var properties = type.GetProperties();
for (int i = 0; i < properties.Length; i++)
{
var property = properties[i];
var atts = property.GetCustomAttributes(true);
var att = atts.FirstOrDefault(x => x is DataMemberAttribute);
if (att == null) continue; var order = (att as DataMemberAttribute).Order;
var name = property.Name;
var value = property.GetValue(obj, null);
sbLine = new StringBuilder();
string strValue;
if (value == null)
strValue = "null";
else
{
var attrType = value.GetType();
if (attrType.IsEnum)
strValue = ((int)value).ToString();
else if (attrType == typeof(string))
strValue = StringExt.ToCodeFormat(value as string);
else if (attrType.IsValueType)
strValue = value.ToString();
else
strValue = this.toFriendlyString(value, level + 1);
}
if (dict.Values.Count(x => x[0] == name) == 0)
{
if (order == -1) order = GetNextOrderID(dict);
dict.Add(order, new string[] { name, strValue });
}
}
var kvs = dict.OrderBy(x => x.Key).ToArray();
for (int i = 0; i < kvs.Length; i++)
{
string line;
var kv = kvs[i].Value;
var name = kv[0];
var strValue = kv[1];
if (i < dict.Count - 1)
line = $"{makeMultiSymbol(level + 1)}\"{name}\":{strValue},\r\n";
else
line = $"{makeMultiSymbol(level + 1)}\"{name}\":{strValue}\r\n";
sbLine = new StringBuilder();
sbLine.Append(line);
sbAll.Append(sbLine.ToString());
}
sbLine = new StringBuilder();
sbLine.Append($"{makeMultiSymbol(level)}}}");
sbAll.Append(sbLine.ToString());
}
var result = sbAll.ToString();
return result;
} private string makeMultiSymbol(int count)
{
var symbol = "\t";
var sb = new StringBuilder();
for (int i = 0; i < count; i++)
{
sb.Append(symbol);
}
return sb.ToString();
}
/// <summary>
/// 字节数组转换为Json对象
/// </summary>
/// <param name="b">字节数组</param>
/// <returns>Json对象</returns>
public static T From(byte[] b)
{
var serializer = new DataContractJsonSerializer(typeof(T));
using (var ms = new MemoryStream(b))
{
var o = (T)serializer.ReadObject(ms);
return o;
}
}
/// <summary>
/// 字符串转换为Json对象
/// </summary>
/// <param name="s">字符串</param>
/// <returns>Json对象</returns>
public static T Parse(string s)
{
var b = Encoding.UTF8.GetBytes(s);
var obj = From(b);
return obj;
}
/// <summary>
/// 将Json对象存储为文件
/// </summary>
/// <param name="filePath">保存文件名</param>
/// <param name="friendlyFormat"></param>
public void Write(string filePath, bool friendlyFormat = false)
{
if (File.Exists(filePath)) File.Delete(filePath);
if (friendlyFormat)
{
var s = this.ToFriendlyString();
File.WriteAllText(filePath, s);
}
else
{
var b = this.ToArray();
File.WriteAllBytes(filePath, b);
}
}
/// <summary>
/// 读取指定文件,加载Json对象
/// </summary>
/// <param name="filePath">Json文件路径</param>
/// <returns>Json对象</returns>
public static T Read(string filePath)
{
var s = File.ReadAllText(filePath);
var obj = JsonObject<T>.Parse(s);
return obj;
}
/// <summary>
/// 获取下一个可用的OrderID
/// </summary>
/// <param name="dict">临时存储节点的字典对象</param>
/// <returns>下一个可用的OrderID</returns>
public int GetNextOrderID(Dictionary<int, string[]> dict)
{
int order = 0;
bool unused = false;
while (!unused)
{
var exist = dict.Keys.Any(x => x == order);
if (!exist)
{
unused = true;
}
else
{
order += 1;
}
}
return order;
} }
/// <summary>
/// 字符串扩展
/// </summary>
public static class StringExt
{
/// <summary>
/// 将字符串转换成带转义符的形式
/// </summary>
/// <param name="s">输入字符串</param>
/// <returns></returns>
public static string ToCodeFormat(this string s)
{
s = s.Replace("\\", "\\\\");
s = s.Replace("\b", "\\b");
s = s.Replace("\f", "\\f");
s = s.Replace("\n", "\\n");
s = s.Replace("\r", "\\r");
s = s.Replace("\'", "\\'");
s = s.Replace("\"", "\\\"");
s = s.Replace("\t", "\\t");
s = s.Replace("\0", "\\0");
s = s.Replace("\a", "\\a");
s = s.Replace("\v", "\\v");
return $"\"{s}\"";
}
}
}
Json对象转换模块(自编代码JsonObject.cs)的更多相关文章
- flex 遍历Object或者JSON对象内容的实现代码
private function init():void { //新建对象 var obj:Object = new Object(); //增加key-value obj["name&qu ...
- java对象与json对象间的相互转换
工程中所需的jar包,因为在网上不太好找,所以我将它放到我的网盘里了,如有需要随便下载. 点击下载 1.简单的解析json字符串 首先将json字符串转换为json对象,然后再解析json对象,过程如 ...
- 前后台$.post交互并返回JSON对象
1.前台代码: $.post(url,{"blogId":blogId},function(reData){ if(reData.state=="success" ...
- java链式创建json对象
我们主要介绍一下:java中如何通过最简单的方式实现链式创建json对象,解决创建json代码臃肿的问题. 1.假设我们要创建一个json对象格式如下: { "code": 0, ...
- Android-解析JSON数据(JSON对象/JSON数组)
在上一篇博客中,Android-封装JSON数据(JSON对象/JSON数组),讲解到Android真实开发中更多的是去解析JSON数据(JSON对象/JSON数组) 封装JSON的数据是在服务器端进 ...
- JSON对象与XML相互转换工具类
依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...
- json对象和json数组
json字符串对象和json字符串数组:JSONArray跟JSONObject的区别就是JSONArray比JSONObject多中括号[] jsonObject: "Row": ...
- android JSONArray JSONObject 字符串转json数组 遍历json对象
String json = "{''data'':[{''name'':''Wallace''},{''name'':''Grommit''}]}"; StringBuffer m ...
- [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)
点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预 ...
- 类型转换及返回json对象的问题
@ResponseBody @RequestMapping(value="/user/getUserId.do")//method=RequestMethod.POST publi ...
随机推荐
- 通过if 简单判断奇数偶数
方法一 方法二 方法三 通过取反的方式进行 其实这三个方法都差别不大都可以用
- JS学习-给Canvas上下文设置样式
给Canvas上下文设置样式 <canvas class="myCanvas" width="700" height="500"> ...
- iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行
今天开发又遇到老问题了,记录一下. 最近换了电脑 win10+vs 2010+oracle11g 客户端. IIS 发布的项目,开始是 把localhost 换成ip地址 总是报 iis 无法在Web ...
- SignalR基本认识以及使用
SignalR基本认识以及使用 什么是WebSocket.SignalR WebSocket 1.WebSocket基于TCP协议,支持二进制通信,双工通信. 2.性能和并发能力更强. 3.WebSo ...
- IntelliJ IDEA 工具识别不了 过大Java文件 引用识别的不了的文件报错
之前出现过proto 生成的文件过大 idea 识别不了 引用消息报错. 解决方案 1.找到IntelliJ IDEA 桌面快捷键图标 右键属性 2.打开文件位置,找到所在目录 3.找到idea.pr ...
- js - class 操作
js - class 操作 // 添加 function addClass(dom, classNameString = '') { if (!dom.className.length) dom.cl ...
- Java-Java数据类型对应MySql数据类型
开发过程中常用的数据类型: Java Mysql 备注 整型 java.lang.Integer tinyint(m) 1个字节 范围(-128~127) java.lang.Integer ...
- [2001年NOIP普及组] 求先序排列
给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入 第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列. 输 ...
- git常用命令查询手册
默认已经连接到远程仓库的情况下 本地文件夹初始化成git仓库.提交本地仓库并添加注释 git init git add 文件1(文件夹1) 文件2(文件夹2)... git commit -m &qu ...
- Kafka的启动 并创建topic
一.进入到kafka的bin目录下,运行 ./kafka-server-start.sh -daemon /app/kafka/config/server.properties 注意:如果是0.9版本 ...