Java 如何将JSON转换为InputText的Obj

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

我有一个json的列表
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());