一、需求场景

(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. 目标检测论文解读9——R-FCN

    背景 基于ResNet 101的Faster RCNN速度很慢,本文通过提出Position-sensitive score maps(位置敏感分值图)来给模型加速. 方法 首先分析一下,为什么基于R ...

  2. css 固定图片

  3. 配置本地 yum 仓库

    配置本地 yum 仓库 # yum 官网 http://yum.baseurl.org/ # yum 手册页 man yum man yum.conf SEE ALSO pkcon (1) yum.c ...

  4. mdk编译器学习笔记(1)——序

    这两天,学习了keil-mdk编译器的特性,这基本上独立于c语言语法,平时基本上都在强调c语言的学习,但是编译器的学习我们也要注重,类似于gcc一样,不也有很多网上的资料,讲述gcc的特性和用法吗.作 ...

  5. jdbc笔记2

    private static String driver; private static String url; private static String username; private sta ...

  6. opencv4.0.0+cmake编译(含contrib)

    https://blog.csdn.net/bobo184/article/details/88749651 前言笔者环境:win10+vs2015+cmake3.8.2 介绍下4.0.0的新特性,沿 ...

  7. 树莓派项目(1-2)人脸识别 C++

    级联分类器 在这里,我们学习如何使用objdetect在我们的图像或视频中查找对象 https://docs.opencv.org/3.3.0/db/d28/tutorial_cascade_clas ...

  8. ESP8266 SDK开发: 开发环境搭建

    前言 这节安装下编程软件, 可以去官网下载, https://wiki.ai-thinker.com/ai_ide_install 也可以安装我提供的(我使用的为官方以前版本) 建议安装我提供的,有问 ...

  9. Android 开发基础入门篇: 生成带有签名的apk安装包

    说明: 软件默认生成的安装包没有签名,现在手机安装APP的时候要求,安装包必须有签名才可以 默认生成的APK位置 现在生成带有签名的APK 我一般放到当前工程根目录,然后文件名字 key 有些时候需要 ...

  10. day 19

    If you think you can, you can. And if you think you can't, you're right.