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)的更多相关文章

  1. flex 遍历Object或者JSON对象内容的实现代码

    private function init():void { //新建对象 var obj:Object = new Object(); //增加key-value obj["name&qu ...

  2. java对象与json对象间的相互转换

    工程中所需的jar包,因为在网上不太好找,所以我将它放到我的网盘里了,如有需要随便下载. 点击下载 1.简单的解析json字符串 首先将json字符串转换为json对象,然后再解析json对象,过程如 ...

  3. 前后台$.post交互并返回JSON对象

    1.前台代码: $.post(url,{"blogId":blogId},function(reData){ if(reData.state=="success" ...

  4. java链式创建json对象

    我们主要介绍一下:java中如何通过最简单的方式实现链式创建json对象,解决创建json代码臃肿的问题. 1.假设我们要创建一个json对象格式如下: { "code": 0, ...

  5. Android-解析JSON数据(JSON对象/JSON数组)

    在上一篇博客中,Android-封装JSON数据(JSON对象/JSON数组),讲解到Android真实开发中更多的是去解析JSON数据(JSON对象/JSON数组) 封装JSON的数据是在服务器端进 ...

  6. JSON对象与XML相互转换工具类

    依赖jar <dependency> <groupId>dom4j</groupId> <artifactId>dom4j</artifactId ...

  7. json对象和json数组

    json字符串对象和json字符串数组:JSONArray跟JSONObject的区别就是JSONArray比JSONObject多中括号[] jsonObject: "Row": ...

  8. android JSONArray JSONObject 字符串转json数组 遍历json对象

    String json = "{''data'':[{''name'':''Wallace''},{''name'':''Grommit''}]}"; StringBuffer m ...

  9. [Json] C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json (转载)

    点击下载 ConvertJson.rar 本类实现了 C#ConvertJson|List转成Json|对象|集合|DataSet|DataTable|DataReader转成Json|等功能大家先预 ...

  10. 类型转换及返回json对象的问题

    @ResponseBody @RequestMapping(value="/user/getUserId.do")//method=RequestMethod.POST publi ...

随机推荐

  1. 通过if 简单判断奇数偶数

    方法一 方法二 方法三 通过取反的方式进行 其实这三个方法都差别不大都可以用

  2. JS学习-给Canvas上下文设置样式

    给Canvas上下文设置样式 <canvas class="myCanvas" width="700" height="500"> ...

  3. iis 无法在Web服务器上启动调试。打开的URL的IIS辅助进程当前没有运行

    今天开发又遇到老问题了,记录一下. 最近换了电脑 win10+vs 2010+oracle11g 客户端. IIS 发布的项目,开始是 把localhost 换成ip地址 总是报 iis 无法在Web ...

  4. SignalR基本认识以及使用

    SignalR基本认识以及使用 什么是WebSocket.SignalR WebSocket 1.WebSocket基于TCP协议,支持二进制通信,双工通信. 2.性能和并发能力更强. 3.WebSo ...

  5. IntelliJ IDEA 工具识别不了 过大Java文件 引用识别的不了的文件报错

    之前出现过proto 生成的文件过大 idea 识别不了 引用消息报错. 解决方案 1.找到IntelliJ IDEA 桌面快捷键图标 右键属性 2.打开文件位置,找到所在目录 3.找到idea.pr ...

  6. js - class 操作

    js - class 操作 // 添加 function addClass(dom, classNameString = '') { if (!dom.className.length) dom.cl ...

  7. Java-Java数据类型对应MySql数据类型

    开发过程中常用的数据类型:   Java Mysql 备注 整型 java.lang.Integer tinyint(m) 1个字节  范围(-128~127)  java.lang.Integer ...

  8. [2001年NOIP普及组] 求先序排列

    给出一棵二叉树的中序与后序排列.求出它的先序排列.(约定树结点用不同的大写字母表示,长度<=8). 输入 第一行输入一个字符串表示二叉树的中序排列,第二行输入一个字符串表示二叉树的后序排列. 输 ...

  9. git常用命令查询手册

    默认已经连接到远程仓库的情况下 本地文件夹初始化成git仓库.提交本地仓库并添加注释 git init git add 文件1(文件夹1) 文件2(文件夹2)... git commit -m &qu ...

  10. Kafka的启动 并创建topic

    一.进入到kafka的bin目录下,运行 ./kafka-server-start.sh -daemon /app/kafka/config/server.properties 注意:如果是0.9版本 ...