C# 手写将对象转换为Json方法
一、需求场景
(1)不能用JavaScriptSerializer、DataContractJsonSerializer、Newtonsoft.Json这些写好的方法,需要自己写方法。
(2)转化的类的字段名称是固定不变的。
二、具体实现
(1)先定义好需要的两个类,Order(订单)和Good(商品)
/// <summary>
/// 订单
/// </summary>
public class Order
{ public Order()
{
this.Goods = new List<Good>();
}
/// <summary>
/// 订单号
/// </summary>
public string OrderNumber { get; set; }
/// <summary>
/// 总价格
/// </summary>
public double SumPrice { get; set; } /// <summary>
/// 创建时间
/// </summary>
public DateTime CreateTime { get; set; } public List<Good> Goods { get; set; }
} /// <summary>
/// 商品
/// </summary>
public class Good
{
/// <summary>
/// 名称
/// </summary>
public string Name { get; set; } /// <summary>
/// 价格
/// </summary>
public double Price { get; set; }
}
(2)实例化order并进行赋值
#region 初始化myOrder
Order myOrder = new Order
{
OrderNumber = "test521",
SumPrice = 80.3,
CreateTime = DateTime.Now
};
myOrder.Goods = new List<Good>(); Good goodOne = new Good
{
Name="明朝那些事",
Price=50.3
};
myOrder.Goods.Add(goodOne); Good goodTwo = new Good
{
Name = "简单逻辑学",
Price =
};
myOrder.Goods.Add(goodTwo);
#endregion
(3)将myOder对象转化为Json字符串(需引入命名空间:System.Reflection)
#region 将对象转换为json
IList<Dictionary<string, object>> ld = new List<Dictionary<string, object>>();
//先把Name和Code放进去
StringBuilder jsonStr = new StringBuilder();
string attrName = "";
jsonStr.Append("{");
foreach (System.Reflection.PropertyInfo p in myOrder.GetType().GetProperties())
{
var name = p.Name;
//判断是否是泛型
if ((p.PropertyType.IsGenericType))
{
PropertyInfo[] props = typeof(Good).GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly);
jsonStr.Append("\"Goods\":");
jsonStr.Append("["); for (int i = ; i < myOrder.Goods.Count; i++)
{
jsonStr.Append("{");
foreach (PropertyInfo property in props)
{
//如果是double类型,则属性值不需要加引号
if (property.PropertyType.Name == "Double")
{
jsonStr.Append("\"" + property.Name + "\":" + property.GetValue(myOrder.Goods[i], property.GetIndexParameters()) + "");
}
else
{
jsonStr.Append("\"" + property.Name + "\":\"" + property.GetValue(myOrder.Goods[i], property.GetIndexParameters()) + "\"");
} //jsonStr.Append("}");
//如果不是最后一个
if (property != props[props.Length - ])
{
jsonStr.Append(",");
}
} //如果不是最后一个元素,需要加上逗号
jsonStr.Append("}");
if (i != myOrder.Goods.Count - )
{
jsonStr.Append(",");
}
}
jsonStr.Append("]");
}
else
{
attrName = p.Name;
object o = p.GetValue(myOrder, null);
//如果是double类型,则属性值不需要加引号
if (p.PropertyType.Name == "Double")
{
jsonStr.Append("\"" + attrName + "\":" + o.ToString() + ",");
}
else
{
jsonStr.Append("\"" + attrName + "\":\"" + o.ToString() + "\",");
}
}
}
jsonStr.Append("}");
string str = jsonStr.ToString();
#endregion
(4)效果
写在后面的话:该方法只对于文中的数据类型有用,稍微变化顺序,转出来的数据就不符合要求,适应力不强。
C# 手写将对象转换为Json方法的更多相关文章
- Django 将数据库查出的 QuerySet 对象转换为 json 字符串
通过Django查询出MySQL数据库的数据,并将查询出的QuerySet 对象转化成 json 字符串. 写这个例子的作用主要是用来为手机端提供接口用,记录一下,以后 说不准 肯定能用到! ---- ...
- JSon_零基础_005_将po(bean)对象转换为JSon格式的对象字符串,返回给界面
将po(bean)对象转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写po(bean)类: package com.west.webcourse.po; /** * 第01步:编写be ...
- JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面
将Set集合对象转换为JSon格式的对象字符串,返回给界面 需要导入的jar包: 编写:servlet: package com.west.webcourse.servlet; import java ...
- JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面
将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...
- JackSon将java对象转换为JSON字符串
JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的writeValueA ...
- json转js对象方法,JS对象转JSON方法
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...
- (后端)JackSon将java对象转换为JSON字符串(转)
转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...
- 将对象转换为JSON字符串
将对象转换为JSON串: 方案一: 可以通过json-lib工具jar包进行转化:在www.json.org官网下载jar包. 方案二: 通过ObjectMapper对象进行转换 需要引入相应的jar ...
- ObjectMapper用于将java对象转换为json格式数据以及JSONObject对象解析json格式数据
ObjectMapper objectMapper = new ObjectMapper(); //反序列化的时候如果多了其他属性,不抛出异常 objectMapper.configure(Deser ...
随机推荐
- 蓝色映象 幻舞少女之剑 BLUE REFLECTION 后感
到底是看片收获多还是游戏收获多?在刷蓝色反射的时候刷了2部番.所以,我到底是为了什么在玩游戏呢? 岸田メル的人设,毋庸置疑,唯美想舔,且总能给人一种绝无杂质,纯洁治愈的感觉,再加上浅野隼人的配乐,恰如 ...
- 【JavaScript】内部与外部引入方式
1.内部引入方式: script的type属性默认为"text/javascript",可以不写 <script type="text/javascript&quo ...
- LOJ 2249: 洛谷 P2305: bzoj 3672: 「NOI2014」购票
题目传送门:LOJ #2249. 题意简述: 有一棵以 \(1\) 号节点为根节点的带边权的树. 除了 \(1\) 号节点的所有节点上都有人需要坐车到达 \(1\) 号节点. 除了 \(1\) 号节点 ...
- WPF 用户控件的自定义依赖属性在 MVVM 模式下的使用备忘
依赖属性相当于扩充了 WPF 标签的原有属性列表,并可以使用 WPF 的绑定功能,可谓是十分方便的:用户控件则相当于代码重用的一种方式:以上几点分开来还是比较好理解的,不过要用到MVVM 模式中,还是 ...
- gradle应用
官网下载 http://services.gradle.org/distributions/ 解压并配置环境 1.解压gradle到你想要的目录 2.配置环境变量 GRADLE_HOME=D:\gra ...
- 常用.Net 6.0 新特性
1.nameof表达式.Nameof表达式可以直接返回对象定义的名称,比如参数.枚举.变量. 控件.属性等.可以大大减少硬编码的使用,提高程序灵活性. }, 2.字符串嵌入值($). MsgBox.S ...
- 【oracle】根据日、月、年分组
--根据日期分组--------------------------------------------------- SELECT to_char(to_date(XXXX, 'yyyymmdd') ...
- Babel7 转码
ES6 (ES2015)更新了很多新的js语法, 也添加了一些新的API, 但不是所有的浏览器对这些新特性都支持的很好, 通过babel可以高版本的js转成低版本的js (ES 5.1), 同时对于J ...
- python gevent协程
安装 pip install gevent import gevent from gevent import monkey monkey.patch_all()#捕捉所有阻塞,不止接收gevent.s ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解
昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...