Java 如何将JSON转换为InputText的Obj
我有一个json的列表Java 如何将JSON转换为InputText的Obj,java,jsf,Java,Jsf,我有一个json的列表list,每个字符串都有这样的json{“id”:“22”,“name”:“name”,“order”:“1”},我想把它提取到输入框的列表中,然后当我保存它时 我想把所有更改都转换成JSON @ManagedBean @ViewScoped public class LiveStreamController extends ProductController implements Serializable { private static final long
list
,每个字符串都有这样的json{“id”:“22”,“name”:“name”,“order”:“1”}
,我想把它提取到输入框的列表中,然后当我保存它时
我想把所有更改都转换成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<>();
...
}
@ManagedBean
@视域
公共类LiveStreamController扩展ProductController实现可序列化{
私有静态最终长serialVersionUID=5037909267669512508L;
私有静态最终记录器Logger=LoggerFactory.getLogger(LiveStreamController.class);
私有LiveStream-LiveStream;
....
}
公共类LiveStream扩展产品实现可序列化{
private List jsons=new ArrayList();
...
}
我想读一读
<c:forEach items="#{liveStreamController.liveStream.jsons}"
var="json ">
<h:outputFormat value="#{json.name}" />
<p:inputText value="#{json.order}" />
</c:forEach>
实际上,您不是在问JSF问题,而是在问EL问题,因为
{json.name}
表达式就是
关于“问题”。。。
如果var=“json”
的值是一个字符串
,在您的案例中就是这样,那么它将由基本解析程序解析,这些解析程序肯定知道字符串
。将尝试通过显然不存在的getName()
调用字符串上的属性name
,导致在java.lang.string类型上找不到属性“name”。所有这些都在本文中进行了解释。因此,像您的示例中那样使用它将不起作用
关于阅读的解决方案。。。
基本上有3种读取JSON并显示它的解决方案
新字符串EL解析器
您可以创建一个自定义EL解析器,并按照解析器的顺序将其放在第一位,以便对于每个需要解析的字符串,检查它是否是有效的JSON(最低限度地解析它),如果您认为它是JSON,则完全解析JSON并读取/解释EL并尝试将其应用于JSON对象。就我所知,这一切都将相当昂贵(但巴卢斯克可能有不同的想法)
新JSON EL解析器
第二个更好的解决方案是将字符串转换为您选择的JSON对象(Java中有很多,包括标准化的JSON-P,因为JavaEE7和JavaEE8的更新版本)。据我所知,并没有默认包含的EL解析器知道如何在EL中处理这些,但不知道这将如何执行,测试是知道的
现有EL解析器
第三个选项是将JSON转换为正常的强类型对象,然后让正常的现有解析器对其进行操作。这可以是默认的现有java类型,如Map
、List
、String
和其他正常值,但它甚至可以是更强的类型,如Person
、Order
,将JSON字符串转换为强类型对象是存在于非标准化JSON库中的一项功能,但在Java EE 8 JSON-B之前,默认Java(EE)中没有这项功能。这还有一个额外的优点,即代码完成和验证在IDE中工作
关于写作的解决方案。。。
由于您似乎确实希望将结果写回JSON字符串(您的示例中有一个输入),因此第一个读取解决方案很难扩展到写入,如果可能的话,它将完全打破您不编写代码而能够使用它的优势。第二个和第三个解决方案可能都能工作,但第三个方案的优点是可以实现输入验证,如bean验证等。实际上,您不是在问JSF问题,而是在问EL问题,因为{json.name}
表达式就是
关于“问题”。。。
如果var=“json”
的值是一个字符串
,在您的案例中就是这样,那么它将由基本解析程序解析,这些解析程序肯定知道字符串
。将尝试通过显然不存在的getName()
调用字符串上的属性name
,导致在java.lang.string类型上找不到属性“name”。所有这些都在本文中进行了解释。因此,像您的示例中那样使用它将不起作用
关于阅读的解决方案。。。
基本上有3种读取JSON并显示它的解决方案
新字符串EL解析器
您可以创建一个自定义EL解析器,并按照解析器的顺序将其放在第一位,以便对于每个需要解析的字符串,检查它是否是有效的JSON(最低限度地解析它),如果您认为它是JSON,则完全解析JSON并读取/解释EL并尝试将其应用于JSON对象。就我所知,这一切都将相当昂贵(但巴卢斯克可能有不同的想法)
新JSON EL解析器
第二个更好的解决方案是将字符串转换为您选择的JSON对象(Java中有很多,包括标准化的JSON-P,因为JavaEE7和JavaEE8的更新版本)。据我所知,并没有默认包含的EL解析器知道如何在EL中处理这些,但不知道这将如何执行,测试是知道的
现有EL解析器
第三个选项是将JSON转换为正常的强类型对象,然后让正常的现有解析器对其进行操作。这可以是默认的现有java类型,如Map
、List
、String
和其他正常值,但它甚至可以是更强的类型,如Person
、Order
,将JSON字符串转换为强类型对象是存在于非标准化JSON库中的一项功能,但在Java EE 8 JSON-B之前,默认Java(EE)中没有这项功能。这还有一个额外的优点,即代码完成和验证在ID中工作
public class JsonWrapper {
JsonObject o;
public JsonWrapper(String s) {
this(new JsonParser().parse(s).getAsJsonObject());
}
public JsonWrapper(JsonObject o) {
this.o = o;
}
public String getJsonText() {
return o.getAsString();
}
public DataWrapper get(String field) {
return new DataWrapper(field);
}
public class DataWrapper {
String field;
public DataWrapper() {
}
public DataWrapper(String field) {
this.field = field;
}
public String getData() {
return o.get(field).getAsString();
}
public void setData(String s) {
o.add(field, new JsonPrimitive(s));
}
}
}
List<JsonWrapper> jwList = s.stream().map(s1 -> new JsonWrapper(s1)).collect(Collectors.toList());
setter & getter
<c:forEach items="#{liveStreamController.liveStream.jwList}" var="jw">
<h:outputFormat value="#{jw.get('name').data}" />
<p:inputText value="#{jw.get('order').data}" />
</c:forEach>
List<String> jsonList = jw.stream().map(JsonWrapper::getJsonText).collect(Collectors.toList());