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. Job for nfs-server.service failed because the control process exited with error code. See "systemctl status nfs-server.service" and "journalctl -xe" for details.

    问题: 解决:

  2. gitea 常用命令

    gitea 常用命令   配置文件位置 /home/custom/conf/app.ini cd //home启动nohup ./gitea web & [root@iZ4jbz0xj0nx7 ...

  3. docker容器生命周期管理

    查看容器版本 docker version [root@node1 ~]# docker version Client: Docker Engine - Community Version: 20.1 ...

  4. 3d-force-graph使用及相关设置

    首先安装3d-force-graph模块到项目依赖: npm install 3d-force-graph 在需要使用的vue页面中导入 import ForceGraph3D from '3d-fo ...

  5. iOS底层原理01:源码探索的三种方式

    ios 开发探索源码三种方法 1.下符号断点的形式直接跟流程 2.通过摁住 control + step  into 3.汇编查看跟流程 1.符号断点直接跟流程 以alloc为例: 选择断点Symbo ...

  6. Unity 消息机制

    最近有新项目需要和同事合作开发,他做UI 我做网络层,做着做着发现 如果我们要相对独立完成自己的开发任务,那我们的代码耦合得减少,不然 一个人代码有大改的时候,另一个人也要进行大幅修改,这样不便于后期 ...

  7. 实验:利用mqtt-spring-boot-starter实现后台云服务数据采集和远程控制

    1.资源地址及使用说明 https://search.maven.org/artifact/com.github.tocrhz/mqtt-spring-boot-starter/1.2.7/jar 2 ...

  8. MFC中利用CFileDialog选择文件并读取文件所遇到的问题和解决方法

    在用MFC编写一个上位机时,需要实现选择和读取一个二进制文件,本来以为很简单的但是在实现过程中遇到很多问题,所幸都一一解决,这里做一下记录. 首先在实现文件选择,在界面上设置一个按钮,并在点击事件函数 ...

  9. 创建一个简单的signalr项目

    1:新建一个empty的MVC项目 2:如果没有安装过signalr过那么要通过Nuget安装signalr 3:新建一个controller 然后建一个view =>index 4:新建一个s ...

  10. Flutter在iOS中一些点

    1. ios对Flutter有如下依赖 Flutter.framework:     Flutter engine等: APP.framework:业务代码, 由dart代码生成.App.framew ...