比如传入的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"
提示应该需要用到 递归 和 反射吧
写一个递归的方法就可以了
求源码
@龍四: 看看这个
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: 没用过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);
}
@SeayXu: 严重鄙视你们这种直接提供代码的,最多提供一些伪代码就可以了。
@龍四: 这只是一种方式,只要可以实现就好了。
@SeayXu: 3Q
"data" : {
data: 3}这种情况你怎么办?
就返回:data=3 啊 叶子节点值
传参是json字符串,
想得到的值是一个List<string> 集合的值就是叶子节点的 key=value
List<string> lst = new List<string>
lst.add("data=3 ")
返回的就是lst
@龍四: 是我没讲清楚.我的意思是重复的子节点名怎么处理?不过看了下你是来要代码的就算了...当我没回答过.
@吴瑞祥: 重复子节点名不用管 返回的是List<string> 不是字典 给方法思路也行
序列化jobject,然后递归循环
这个问题已经解决了吗?还需要帮助不?
解决了 谢谢 博友
NewtonSoft.json