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. Dinic的几种复杂度

    学了那么久网络流才发现自己不知道 Dinic 算法的一个在各边容量均为 \(1\) 的网络时复杂度上的结论.我说为啥学术社区那题优化建图复杂度是对的呢-- 以下均认为使用了当前弧优化与多路增广. 以下 ...

  2. android手机无线调试

    1.手机与电脑先通过usb链接2.adb devices查看是否链接成功(链接成功会显示设备列表)3.adb tcpip 5555(0-65535之间取值,默认5555输进去)5:断开数据线,查看手机 ...

  3. 删除没有刀路的刀具.txt

      1 UF_initialize(); 2 std::vector<tag_t>tool_tag; 3 std::vector<tag_t>del_tag; 4 tag_t ...

  4. Notepad++轻量级java环境

    2020-07-11 summary: Notepad++搭建轻量级java环境 notepad++搭建轻量级Java 原因:不想用eclipse 一.本机环境 Windows10 64位 已安装No ...

  5. SpringMVC-nfjh

    SpringMVC springmvc项目创建 1.使用maven创建web项目结构 2.补充更改结构 3.springmvc-config.xml 1)添加包扫描(context命名空间) 2)添加 ...

  6. STM32cubemx-HAL库串口断线问题

    STM32cubemx:version5.1 Chip: STM32F446RE IDE:Keil5 Q:小项目上写了个简单的通信包,波特率230400,数据量较大1600Byte/s,DMA的方式实 ...

  7. 汇编debug工具Dosbox使用

    汇编debug工具DOSBOX使用说明 首先新建文件,更改后缀名为asm,然后写入一段汇编程序 之后打开DosBox    输入masm + 文件名(加不加文件名后缀都可以)但如果要加的话,应该加上. ...

  8. win7下MongoDB安装配置

    之前看windows下安装MongoDB操作很是简单,今天在自己笔记本上安装一次,各种小问题.参照网上各大神帖子,再记录下个简单流程以便以后记得. 1.MongoDB官网上下载安装包 2.运行安装包, ...

  9. Day11-数组的使用

    数组的使用 一.数组的使用 package com.array; public class ArrayDemo03 { public static void main(String[] args) { ...

  10. ESP8266开发(物联网)

    使用开发板制作wifi干扰器https://www.jianshu.com/p/f064ca36ee92