一、需求场景

(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方法的更多相关文章

  1. Django 将数据库查出的 QuerySet 对象转换为 json 字符串

    通过Django查询出MySQL数据库的数据,并将查询出的QuerySet 对象转化成 json 字符串. 写这个例子的作用主要是用来为手机端提供接口用,记录一下,以后 说不准 肯定能用到! ---- ...

  2. JSon_零基础_005_将po(bean)对象转换为JSon格式的对象字符串,返回给界面

    将po(bean)对象转换为JSon格式的对象字符串,返回给界面 导入jar包: 编写po(bean)类: package com.west.webcourse.po; /** * 第01步:编写be ...

  3. JSon_零基础_004_将Set集合对象转换为JSon格式的对象字符串,返回给界面

    将Set集合对象转换为JSon格式的对象字符串,返回给界面 需要导入的jar包: 编写:servlet: package com.west.webcourse.servlet; import java ...

  4. JSon_零基础_003_将Map集合对象转换为JSon格式的对象字符串,返回给界面

    将Map集合对象转换为JSon格式的对象字符串,返回给界面 需导入的jar包: 编写servlet: package com.west.webcourse.servlet; import java.i ...

  5. JackSon将java对象转换为JSON字符串

    JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的writeValueA ...

  6. json转js对象方法,JS对象转JSON方法

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  7. (后端)JackSon将java对象转换为JSON字符串(转)

    转载小金金金丶园友: JackSon可以将java对象转换为JSON字符串,步骤如下: 1.导入JackSon 的jar包 2.创建ObjectMapper对象 3.使用ObjectMapper对象的 ...

  8. 将对象转换为JSON字符串

    将对象转换为JSON串: 方案一: 可以通过json-lib工具jar包进行转化:在www.json.org官网下载jar包. 方案二: 通过ObjectMapper对象进行转换 需要引入相应的jar ...

  9. ObjectMapper用于将java对象转换为json格式数据以及JSONObject对象解析json格式数据

    ObjectMapper objectMapper = new ObjectMapper(); //反序列化的时候如果多了其他属性,不抛出异常 objectMapper.configure(Deser ...

随机推荐

  1. linux的性能调优

    单机调优: 分析性能瓶颈的原因,解决它.   cpu子系统 内存子系统 IO子系统 网络系统       @cpu子系统调优 cpu技术指标 xeon E5520 2.27GHz 8192kb # c ...

  2. django中运行定时任务脚本

    需要使用到django_apscheduler模块,因此先安装: pip install django-apscheduler 然后在工程的settings.py文件中的INSTALLED_APPS模 ...

  3. 13-cmake语法-路径设置

    路径设置: 包括头文件路径.库文件路径.库文件名等 INCLUDE_DIRECTORIES 向工程添加多个特定的头文件搜索路径,路径之间用空格分隔,如果路径包含空格,可以使用双引号将它括起来,默认的行 ...

  4. 09-cmake语法-add_dependencies()

    在编译器的命令行上,为当前路径以及下层路径的源文件加入一些define flag.这个命令可以用来引入任何flag,但是它的原意是用来引入预处理器的定义.那些以-D或/D开头的.看起来像预处理器定义的 ...

  5. Java反射之Bean修改更新属性值等工具类

    package com.bocean.util; import java.lang.annotation.Annotation; import java.lang.reflect.Field; imp ...

  6. Python基础之while和for

    实现ATM的输入密码重新输入的功能 while True: user_db = 'nick' pwd_db = '123' inp_user = input('username: ') inp_pwd ...

  7. windows 下批量删除git 分支

    删除筛选出来的分支,比如fixed git branch -D @(git branch | select-string  "fixed" | Foreach {$_.Line.T ...

  8. 记录Windows下文件操作记录

    https://blog.csdn.net/huashuolin001/article/details/73863324

  9. ECMAScript6之Class

    1.Class的基本语法 1.1简介 基本上,ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰.更像面向对象编程的语法而 ...

  10. Mac下Sublime Text常用插件

    Mac下Sublime Text常用插件 SideBarEnhancements 右键菜单增强插件 BracketHighlighter 括号.引号.标签高亮插件 Pretty JSON JSON美化 ...