{
"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; }
看了下问题描述,感觉有点读不懂,直接反序列化后取值不就行了?
ctrl+f //这里 经理说object可以直接取到路径上的key
搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值 “产业园基地” 。
GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归 则第二次传入的key为 GJAerialView
要是没有下一级元素 ,就返回 “产业园基地” 。
@快乐起航: 感觉明白你的意思了,你这种应该就是直接解析Json。我就以你上面给的Json数据做个演示,你看下。
示意图:
代码:
@leslie_xin: 你好!感谢耐心回答!要是有三级甚至四级等等,那这个方法还适用么
@快乐起航: 适用的。使用这种直接解析Json的方式,有个特点就是必须要知道Json的结构,既然知道了Json的结构,那取值的方式都是一样的。
-
如果不知道Json的结构的话,就需要通过遍历去解析了。
啥意思?你需要反序列化?
我们如何通过传入到后台的key(如提供第一个参数 room.GJAerialView 则程序返回 “产业园基地”,room1. L02Room1 返回 "显示器组装车间1")
可以通过 Newtonjson将字符串转成 json,在通过反射就可以获取任意key的值了
目前不是不能实现的问题
ctrl+f //这里 经理说object可以直接取到路径上的key
搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值 “产业园基地” 。
GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归 则第二次传入的key为 GJAerialView
要是没有下一级元素 ,就返回 “产业园基地” 。
看清楚要求了么
@快乐起航: 无语,转成json之后,你可以自己判断还有没有下一级就好了啊,有就继续往下,自己递归判断一下就好了,多少级都无所谓的,自己用Newtonjson 试下就知道了
转一下json
目前不是不能实现的问题
ctrl+f //这里 经理说object可以直接取到路径上的key
搜索这句话。 经理说根据它前面的object可以直接不用递归就可以返回 room.GJAerialView 的值 “产业园基地” 。
GetJsonStringOrValue 这个方法我第一次传入的key为 room 递归 则第二次传入的key为 GJAerialView
要是没有下一级元素 ,就返回 “产业园基地” 。
看清楚要求了么,我们也还要考虑多级,不止2级的情况
你能把你想要的东西抽象为一个方法吗?参数是什么,返回值是什么,没明白你想干什么
建议改进一下排版,支持 markdown 语法
– dudu 3年前