首页新闻找找看学习计划

求一个C#方法:将传入的json值扁平化,只提取叶子节点的键值;忽略空值,用=拼接键值

0
悬赏园豆:80 [已解决问题] 解决于 2016-05-31 22:18

比如传入的json是:

{
   "timestamp" : "2016-04-08 11:21:25",
   "apiKey" : "jdtest",
   "data" : {
      adultQuantity : 3,
      childQuantity : 0,
      "babyQuantity" : 0,
      "segmentList" : [{
            "departCityCode" : "PNZ",
            "arriveCityCode" : "SHA",
            "departDate" : "2016-04-19"
         }
      ]
   },

   "H" : "value", //大小写区分
   "c" : null, //空值,生成签名时忽略
   "v" :"", //空字符串,生成签名时忽略
   "w" : "null" //非空字符串,不会忽略
}

 

返回的(List<string>)值:

"H=value",

"adultQuantity=3",

"apiKey=jdtest",

"arriveCityCode=SHA",

"babyQuantity=0",

"childQuantity=0",

"departCityCode=PNZ",

"departDate=2016-04-19",

"timestamp=2016-04-08 11:21:25",

"w=null"

问题补充:

提示应该需要用到 递归 和 反射吧

龍四的主页 龍四 | 初学一级 | 园豆:34
提问于:2016-05-31 10:00
< >
分享
最佳答案
0

写一个递归的方法就可以了

收获园豆:80
seayxu | 大侠五级 |园豆:5468 | 2016-05-31 10:08

求源码

龍四 | 园豆:34 (初学一级) | 2016-05-31 10:09

@龍四: 看看这个

 1 using System;
 2 using System.Collections.Generic;
 3 using System.Linq;
 4 using System.Text;
 5 using System.Threading.Tasks;
 6 
 7 namespace ConsoleApplication1
 8 {
 9     using Newtonsoft.Json;
10     using Newtonsoft.Json.Linq;
11 
12     class Program
13     {
14         static void Main(string[] args)
15         {
16             string jsonstr =
17                 "{\"timestamp\":\"2016-04-08 11:21:25\",\"apiKey\":\"jdtest\",\"data\":{\"adultQuantity\":3,\"childQuantity\":0,\"babyQuantity\":0,\"segmentList\":[{\"departCityCode\":\"PNZ\",\"arriveCityCode\":\"SHA\",\"departDate\":\"2016-04-19\"}]},\"H\":\"value\",\"c\":null,\"v\":\"\",\"w\":\"null\"}";
18             Dictionary<string, object> dict = new Dictionary<string, object>();
19 
20             JObject _jObject = JObject.Parse(jsonstr);
21 
22             string str = Fun(_jObject);
23         }
24 
25         public static string Fun(JObject obj)
26         {
27             string result = null;
28 
29             foreach (var item in obj)
30             {
31                 if (typeof(JObject) == item.Value.GetType())
32                 {
33                     JObject child = (JObject)item.Value;
34                     string tmp = Fun(child);
35                     result += tmp;
36                 }
37                 else if (typeof(JArray) == item.Value.GetType())
38                 {
39                     JArray _jarray = (JArray)item.Value;
40                     foreach (var jitem in _jarray)
41                     {
42                         JObject jchild = (JObject)jitem;
43                         string tmp = Fun(jchild);
44                         result += tmp;
45                     }
46                 }
47                 else
48                 {
49                     if (!(item.Value != null && item.Value.ToString().Trim().Equals("")))
50                     {
51                         result += string.Format("{0}={1},", item.Key, item.Value);
52                     }
53                 }
54             }
55             return result;
56         }
57 } 58 }

希望可以帮到你

seayxu | 园豆:5468 (大侠五级) | 2016-05-31 11:34

@SeayXu: 没用过JObject 和 JArray 这两个类,你这么做是对的  看来我们类库了解的还不够多,下面是我自己写的:

/// <summary>
/// 递归方法获取json叶子节点值
/// </summary>
/// <param name="key"></param>
/// <param name="obj"></param>
/// <param name="lst"></param>
public void PropertyFilter(string key, object obj, List<string> lst)
{
if (null == obj)
return;

//数组
if (obj is System.Array)
{
JsonArrayPropertyFilter(key, (Array)obj, lst);
}
else
{
Type t = obj.GetType();
//值类型 或非空字符串
if (t.BaseType.Name.IgnoreCaseEquals("ValueType") || (t.Name.IgnoreCaseEquals("string") && t.ToString().Length > 0))
{
lst.Add(key.Trim() + "=" + obj);
return;
}

//引用类型
PropertyInfo[] propertyInfos = t.GetProperties();
foreach (var finfo in propertyInfos)
{
var k2 = finfo.Name;
var v2 = finfo.GetValue(obj, null);
PropertyFilter(k2, v2, lst);
}
}
}

public void JsonArrayPropertyFilter(String key, Array value, List<String> list)
{
if (value.Length == 0)
return;
foreach (var v in value)
PropertyFilter(key, v, list);
}

龍四 | 园豆:34 (初学一级) | 2016-05-31 11:43

@SeayXu: 严重鄙视你们这种直接提供代码的,最多提供一些伪代码就可以了。

czd890 | 园豆:7577 (大侠五级) | 2016-05-31 11:43

@龍四: 这只是一种方式,只要可以实现就好了。

seayxu | 园豆:5468 (大侠五级) | 2016-05-31 12:03

@SeayXu: 3Q

龍四 | 园豆:34 (初学一级) | 2016-05-31 22:16
其他回答(4)
0

 "data" : {
      data: 3}这种情况你怎么办?

吴瑞祥 | 园豆:28731 (高人七级) | 2016-05-31 10:01

就返回:data=3 啊  叶子节点值

传参是json字符串,

想得到的值是一个List<string>  集合的值就是叶子节点的 key=value

 

支持(0) 反对(0) 龍四 | 园豆:34 (初学一级) | 2016-05-31 10:04

List<string> lst = new List<string>

lst.add("data=3 ")

返回的就是lst

支持(0) 反对(0) 龍四 | 园豆:34 (初学一级) | 2016-05-31 10:05

@龍四: 是我没讲清楚.我的意思是重复的子节点名怎么处理?不过看了下你是来要代码的就算了...当我没回答过.

支持(0) 反对(0) 吴瑞祥 | 园豆:28731 (高人七级) | 2016-05-31 10:11

@吴瑞祥: 重复子节点名不用管 返回的是List<string>  不是字典 给方法思路也行

支持(0) 反对(0) 龍四 | 园豆:34 (初学一级) | 2016-05-31 10:12
0

序列化jobject,然后递归循环

czd890 | 园豆:7577 (大侠五级) | 2016-05-31 10:33
0

这个问题已经解决了吗?还需要帮助不?

脚本王子 | 园豆:779 (小虾三级) | 2016-05-31 12:05

解决了 谢谢 博友

支持(0) 反对(0) 龍四 | 园豆:34 (初学一级) | 2016-05-31 22:16
0

NewtonSoft.json

九九哥 | 园豆:182 (初学一级) | 2016-05-31 14:18
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册