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 ...
随机推荐
- Spring的感知能力 Aware
在 Spring 框架中有一个 org.springframework.beans.factory.Aware 接口, Aware 是感知感应的意思,那么此接口的作用就是为 Spring 中的 bea ...
- Httpclient文件上传
public static void upload(String url,File file,String filename) { CloseableHttpClient httpclient = H ...
- Linux下安装Nexus-3.15私服
1.切换到root用户 创建nexus用户:useradd nexus 设置nexus用户密码:passwd nexus 2.创建文件夹并进入该目录 linux中,软件包一般放在opt目录下,安装时, ...
- mysql基础知识之数据类型与约束
一.约束 作用: 保证数据的完整性和一致性表的设计 1.not null 和 default not null 是放在最后用来约束 前面 数据类型的 (在原有基础上本来可以主键后面可以为空,但是一旦在 ...
- jackson springboot配置时间格式
yml文件中这样进行配置 spring: jackson: date-format: yyyy-MM-dd HH:mm:ss spring.jackson.date-format指定日期格式,比如yy ...
- Java多线程编程核心技术-第1章-Java多线程技能-读书笔记
第 1 章 Java 多线程技能 本章主要内容 线程的启动 如何使线程暂停 如何使线程停止 线程的优先级 线程安全相关的问题 1.1 进程和多线程的概念及线程的优点 进程是操作系统结构的基础:是一次程 ...
- Memcache未授权访问漏洞简单修复方法
漏洞描述: memcache是一套常用的key-value缓存系统,由于它本身没有权限控制模块,所以开放在外网的memcache服务很容易被攻击者扫描发现,通过命令交互可直接读取memcache中的敏 ...
- 火车头data下任务文件夹的SpiderResult.db3文件用什么软件打开
火车头采集器默认是用sqlite数据库来保存数据的,新建一个采集,打开data/任务/发现有一个SpiderResult.db3文件,.db3是sqlite的存储文件后缀,那么要如何查看这些文件呢?用 ...
- Kubernetes Pod的数据卷Volume
概述 由于容器本身是非持久化的,因此需要解决在容器中运行应用程序遇到的一些问题.首先,当容器崩溃时,kubelet将重新启动容器,但是写入容器的文件将会丢失,容器将会以镜像的初始状态重新开始:第二,在 ...
- struts2学习1
struts2使用优势 自动封装参数 参数校验 结果的处理(转发|重定向) 国际化 显示等待页面 表单的防止重复提交 struts2具有更加先进的架构以及思想 使用拦截器 struts2的历史 str ...