有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何将JSON转换为InputText的Obj

我有一个json列表List<String>,每个字符串都有这样的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<>();
...
}

我想读一读

            <c:forEach items="#{liveStreamController.liveStream.jsons}"
                var="json ">
                <h:outputFormat value="#{json.name}" />
                <p:inputText value="#{json.order}" />
            </c:forEach>

共 (2) 个答案

  1. # 1 楼答案

    实际上,你不是在问JSF问题,而是一个EL问题,因为#{json.name}表达式就是Expression Language

    关于“问题”

    如果var="json"的值是一个String,在你的例子中就是这样,它将由基本的解析器来解析,这些解析器肯定知道String。将尝试通过显然不存在的getName()调用字符串上的属性name,结果是Property 'name' not found on type java.lang.String。所有这些都在Property 'someproperty' not found on type java.lang.String中进行了解释。因此,在你的例子中使用它是行不通的

    关于阅读的解决方案

    基本上有3种解决方案可以读取并显示JSON

    新的字符串EL解析器
    您可以创建一个自定义EL解析器,并将其按解析器的顺序放在第一位,这样对于每个需要解析的字符串,都会检查它是否是有效的JSON(最低限度地解析它),如果您认为它是JSON,则完全解析JSON并读取/解释EL,并尝试将其应用于JSON对象。就我所知,这一切都将相当昂贵(但巴卢斯克可能有不同的想法)

    新JSON EL解析器
    第二个更好的解决方案是将字符串转换为您选择的JSON对象(Java中有很多,包括一个标准化的“JSON-P”,因为Java EE 7和Java EE 8的更新版本)。据我所知,没有默认包含的EL解析器知道如何在EL中处理这些问题,但是examples exist for the non standardized EL formats不知道这将如何执行,测试是知道的

    现有EL解析器
    第三个选项是将JSON转换为通常的强类型对象,然后让常规的现有解析器对其进行操作。这可以是默认的现有java类型,如MapListString和其他正常值,但它甚至可以是更强的类型,如PersonOrder,将JSON字符串转换为强类型对象是存在于非标准化JSON库中的一个功能,但直到java EE 8,JSON-B。这还有一个额外的优点,即代码完成和验证在IDE中工作

    关于写作的解决方案

    由于您似乎确实希望将结果写回JSON字符串(您的示例中有一个输入),因此第一个读取解决方案很难扩展到写入,如果可能的话,它将完全打破您似乎希望不编写代码而能够使用它的优势。第二个和第三个解决方案可能都能工作,但第三个方案的优点是可以实现输入验证,比如bean验证等等

  2. # 2 楼答案

    创建一个类:

    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
    

    在xhtml中使用它

    <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());