首页 新闻 搜索 专区 学院

C#怎么不用递归获取 json 路径及路径上的值

0
[待解决问题]
{
 "room": {
    "GJAerialView": "产业园基地",
    "L02Room": "显示器组装车间",
    "MRoom": "MI车间",
    "SMTRoom": "SMT车间",
    "SL03Room": "多功能产品组装车间",
    "unknown": "未配置的车间"
  },
 "room1": {
    "GJAerialView1": "产业园基地1",
    "L02Room1": "显示器组装车间1"   
  }........
}

 


json文件 片段如上 
我们如何通过传入到后台的key(如提供第一个参数 room.GJAerialView 则程序返回 “产业园基地”,room1. L02Room1 返回 "显示器组装车间1")

记住 不用递归

 

//第一个方法片段代码如下 (length 是传入key根据 ‘.’来分割的数组的长度)

//arrKey 是传入key 根据‘.’来分割的数组

object value_zh_cn = null;
object value_en = null;
//最终要返回的中英文字符串
string str_zh_cn = "";
string str_en = "";
for (int i = 0; i < length; i++)
{
//如果是第一层 ,那么根据顶级key获取上面读取出来的json字符串
if (i == 0)
{
value_zh_cn = GetJsonStringOrValue(str_zh_cn_json, arrKey[i]);
value_en = GetJsonStringOrValue(str_en_json, arrKey[i]);
}
else//如果非第一层 ,那么根据子级key获取上面读取出来的json字符串或者值
{
value_zh_cn = GetJsonStringOrValue(value_zh_cn as string, arrKey[i]);
value_en = GetJsonStringOrValue(value_en as string, arrKey[i]);
}
}
str_zh_cn = (string)value_zh_cn;
str_en = (string)value_en;

 

 

复制代码
public static object GetJsonStringOrValue(string input_json, string key)
{
if (String.IsNullOrEmpty(input_json) || String.IsNullOrEmpty(key))
return string.Empty;
input_json = input_json.Replace("\r\n", string.Empty);
JavaScriptSerializer serializer = new JavaScriptSerializer();
Dictionary<string, object> json = serializer.DeserializeObject(input_json) as Dictionary<string, object>;
//这里 经理说object可以直接取到路径上的key 
object value;
json.TryGetValue(key, out value);
value = serializer.Serialize(value);

return value;
}
复制代码
快乐起航的主页 快乐起航 | 初学一级 | 园豆:106
提问于:2021-03-04 17:37

建议改进一下排版,支持 markdown 语法

dudu 2个月前
< >
分享
所有回答(5)
0

啥意思?你需要反序列化?

顾晓北 | 园豆:10269 (专家六级) | 2021-03-04 18:00

我们如何通过传入到后台的key(如提供第一个参数 room.GJAerialView 则程序返回 “产业园基地”,room1. L02Room1 返回 "显示器组装车间1")

支持(0) 反对(0) 快乐起航 | 园豆:106 (初学一级) | 2021-03-05 08:07
0

看了下问题描述,感觉有点读不懂,直接反序列化后取值不就行了?

leslie_xin | 园豆:425 (菜鸟二级) | 2021-03-04 21:20

ctrl+f  //这里 经理说object可以直接取到路径上的key

搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值  “产业园基地”  。

GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归  则第二次传入的key为 GJAerialView  

要是没有下一级元素 ,就返回  “产业园基地”  。

支持(0) 反对(0) 快乐起航 | 园豆:106 (初学一级) | 2021-03-05 08:12

@快乐起航: 感觉明白你的意思了,你这种应该就是直接解析Json。我就以你上面给的Json数据做个演示,你看下。
示意图:

代码:

支持(0) 反对(0) leslie_xin | 园豆:425 (菜鸟二级) | 2021-03-05 09:05

@leslie_xin: 你好!感谢耐心回答!要是有三级甚至四级等等,那这个方法还适用么

支持(0) 反对(0) 快乐起航 | 园豆:106 (初学一级) | 2021-03-05 10:13

@快乐起航: 适用的。使用这种直接解析Json的方式,有个特点就是必须要知道Json的结构,既然知道了Json的结构,那取值的方式都是一样的。

如果不知道Json的结构的话,就需要通过遍历去解析了。

支持(0) 反对(0) leslie_xin | 园豆:425 (菜鸟二级) | 2021-03-05 10:16
0

可以通过 Newtonjson将字符串转成 json,在通过反射就可以获取任意key的值了

jqw2009 | 园豆:2274 (老鸟四级) | 2021-03-05 08:34

目前不是不能实现的问题

ctrl+f  //这里 经理说object可以直接取到路径上的key

搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值  “产业园基地”  。

GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归  则第二次传入的key为 GJAerialView  

要是没有下一级元素 ,就返回  “产业园基地”  。

 

看清楚要求了么

支持(0) 反对(0) 快乐起航 | 园豆:106 (初学一级) | 2021-03-05 10:14

@快乐起航: 无语,转成json之后,你可以自己判断还有没有下一级就好了啊,有就继续往下,自己递归判断一下就好了,多少级都无所谓的,自己用Newtonjson 试下就知道了

支持(0) 反对(0) jqw2009 | 园豆:2274 (老鸟四级) | 2021-03-05 10:21
0

转一下json

Cgrain | 园豆:1121 (小虾三级) | 2021-03-05 09:09

目前不是不能实现的问题

ctrl+f  //这里 经理说object可以直接取到路径上的key

搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值  “产业园基地”  。

GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归  则第二次传入的key为 GJAerialView  

要是没有下一级元素 ,就返回  “产业园基地”  。

 

看清楚要求了么,我们也还要考虑多级,不止2级的情况

支持(0) 反对(0) 快乐起航 | 园豆:106 (初学一级) | 2021-03-05 10:15
0

你能把你想要的东西抽象为一个方法吗?参数是什么,返回值是什么,没明白你想干什么

会长 | 园豆:9678 (大侠五级) | 2021-03-13 14:28
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册