一、需求场景

(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. c++ c的拓展

    C++对c的拓展之, 引用和const关键字 bool类型关键字 C++中的布尔类型 C++在C语言的基本类型系统之上增加了bool C++中的bool可取的值只有true和false 理论上bool ...

  2. 两数相加[链表加法] LeetCode.2

    给出两个 非空 的链表用来表示两个非负的整数.其中,它们各自的位数是按照 逆序 的方式存储的,并且它们的每个节点只能存储 一位 数字. 如果,我们将这两个数相加起来,则会返回一个新的链表来表示它们的和 ...

  3. 201871010128-杨丽霞《面向对象程序设计(java)》第二周学习总结

    201871010128-杨丽霞<面向对象程序设计(java)>第二周学习总结 项目 内容 这个作业属于哪个课程 <https://www.cnblogs.com/nwnu-daiz ...

  4. nginx 重定向 rewrite 规则

    1.rewrite配置 server { listen 80 default_server; server_name jeson.t.imooc.io; access_log /var/log/ngi ...

  5. nginx 代理服务

    1.nginx反向代理服务 location ~ /test_proxy.html$ { proxy_pass http://127.0.0.1:8080;(代理访问127.0.0.1:8080) } ...

  6. 修改了celery任务老是执行失败,跟shell中调试的结果不同

    因为没有重启celery,没有删除celerybeat-schedule,导致使用的task任务一直是原来缓存的,所以代码一直无法生效,也是日了狗了

  7. Python——IO多路复用之select模块epoll方法

    Python——IO多路复用之select模块epoll方法 使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll. .├── epoll_c ...

  8. Spring Data学习中心

    Spring Data 概览 Spring Data的使命是为数据访问提供熟悉且一致的基于Spring的编程模型,同时仍保留底层数据存储的特殊特性. 它使数据访问技术,关系数据库和非关系数据库,map ...

  9. nginx1.16+php7.39配置笔记

    vim /etc/nginx/conf.d/default.conf 修改php相关配置如下: location ~ \.php$ {        root           /usr/share ...

  10. valgrind memcheck使用方法及效果(转)

    https://windmissing.github.io/linux/2016-02/valgrind-memcheck.html 一.valgrind 1. Valgrind是什么 Valgrin ...