我有json List<String>
的列表,每个字符串都具有像[{"id":"22","name":"Name","order":"1"}
这样的json,我想将其提取到输入框的列表中,然后在保存时我我想进行所有更改并将其转换为JSON
@ManagedBean
@ViewScoped
public class LiveStreamController extends ProductController implements Serializable {
private static final long serialVersionUID = 5037909267669512508L;
private static final Logger LOGGER = LoggerFactory.getLogger(LiveStreamController.class);
private LiveStream liveStream;
....
}
public class LiveStream extends Product implements Serializable {
private List<String> jsons = new ArrayList<>();
...
}
而且我想读它
<c:forEach items="#{liveStreamController.liveStream.jsons}"
var="json ">
<h:outputFormat value="#{json.name}" />
<p:inputText value="#{json.order}" />
</c:forEach>
如果var="json"
的值为您所用的String
,它将由基本解析器解析,这些解析器肯定会知道String
。将尝试通过显然不存在的name
调用字符串的属性getName()
,从而导致Property 'name' not found on type java.lang.String
。所有这些都在Property 'someproperty' not found on type java.lang.String中进行了说明。因此在您的示例中使用它将不起作用
阅读 ...]的解决方案
New String EL Resolver
您可以创建一个自定义的EL解析器,并将其放在解析器的顺序中,以便对于需要解析的每个字符串,检查它是否有效地是JSON(最小解析),以及您是否认为它是JSON,然后完全解析JSON并读取/解释EL,然后尝试将其应用于JSON对象。据我所知,所有这些都将是相当昂贵的(但是BalusC可能会有不同的想法)新的JSON EL解析器
第二个更好的解决方案是将String转换为您选择的JSON对象(Java中有很多对象,包括标准化的JSON-P,因为Java EE 7和Java EE 8的更新版本) 。据我所知,没有默认的包含在内的EL解析器知道如何在EL中处理这些解析器,但是examples exist for the non standardized EL formats尽管知道如何测试,但尚不清楚。现有的EL解析器
第三种选择是将JSON转换为通常为强类型的对象,然后让常规的现有解析器对其进行操作。这可以是默认的现有Java类型,例如Map
,List
,String
和其他常规值,但是甚至可以更强地键入,例如Person
,Order
,将JSON字符串转换为强类型的对象是非标准JSON库中存在的功能,但默认Java(EE)中不存在,直到Java EE 8,JSON-B。这还有一个优势,即代码完成可以在IDE中进行,验证也可以在IDE中进行]关于写作
...的解决方案