enjoy引擎处理json字符串的问题

波总,您好!

项目开发过程中,遇到一个这样的问题,请帮忙看下,多谢!

我在数据库中一个字符串字段中存入了下面的json字符串值

{"1":{"Name":"张三","id":"68","count":"20","max":"20","min":"0","weight":"100"}}

然后我取到该字段后,setAttr 给一个person变量,把该字段的值传给enjoy处理,看jfinal文档,这样的数据应该是做为一个map来处理的。所以我就调用person["1"]或者person[1],但都报Only the list array and map is supported by index access错误,如果我改用person.get("1")的话,他就报public method not found: java.lang.String.get(java.lang.String)

在网上查了下,链接到之前反馈的一个类似问题,但看回复中,也有人遇到了类似情况,暂时不知如何解决了。



评论区

JFinal

2019-04-23 08:34

先将这个 json 串转成 map,然后再传递给 enjoy 使用即可,大致为:
String jsonString = ...;
Map map = FastJson.getJson().parse(jsonString, Map.class);
setAttr("map", map);

然后 enjoy 中就可以这样使用了:
#(map["1"].name)
#(map["1"].id)

JFinal

2019-04-23 08:34

注意要引入 fastjson 的依赖,异常信息会提示你

无云

2019-04-23 09:26

多谢波总,问题已经解决!

按照您的提示,确实可以访问属性值。但因为我需要循环遍历json,需要放在for循环里来处理,处理过程中发现了新的问题。

#for(x : users)
#(x.name) 这里还是会报错,后来看了下,发现通过循环获得的x是forEntry对象,所以,访问name属性会报错。
#(x.getValue().name) 改成这样就可以了。
#end

另外,刚才看到之前反馈中,您提到可以用for(x:list.value)来遍历的方法,我就试了下,但好像还是不行
#for(x : users.value)
#(x.name) 这样的方式下,既没有报错,也没有任何输出
#end

具体的原因还是没有搞清楚。。。

不过通过这个问题,发现对enjoy的理解还是不够深入,后面有时间的时候还要再看看enjoy的源码。

再次感谢波总!!!

JFinal

2019-04-23 09:30

@无云 这里头其实仅仅是一个对 map 迭代的问题,对 map 迭代文档中有详细的例子:
#for ( x : map)
#(x.key)
#(x.value)
#end

你前面的用法中 users 应该是一个 map,所以你的 #(x.getValue().name) 是可以工作的,因为 x.getValue() 与 x.value 是完全等价的

注意多看文档有关指令这一部分,极其简单 https://www.jfinal.com/doc/6-4

无云

2019-04-23 10:34

嗯,明白了,我再仔细看看文档和代码,多谢!!!

热门反馈

扫码入社