Как мне конвертировать JSON в Obj для InputText - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть список 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 ]

2 голосов
/ 30 апреля 2020

Фактически вы задаете не вопрос JSF, а вопрос EL, поскольку выражение #{json.name} - это просто ... Язык выражений .

О «проблеме» ...

Если значение var="json" равно String, как оно и есть в вашем случае, оно будет решено основанием * 1055 распознаватели, которые наверняка будут знать о String. Будет предпринята попытка вызвать свойство name в строке через getName(), которое, очевидно, не существует, в результате чего Property 'name' not found on type java.lang.String. Все это также объясняется в Свойство 'someproperty', не найденное для типа java .lang.String . Поэтому его использование, как в вашем примере, не будет работать

О решении (ях) для чтения ...

Существует в основном 3 решения для чтения the JSON и его отображение

New String EL Resolver
Вы можете создать собственный распознаватель EL и поместить его первым в порядке распознавателей, чтобы для каждая строка , которую нужно разрешить, проверяет, действительно ли она JSON (минимально ее анализирует), и если вы думаете, что она JSON, то полностью проанализируйте JSON, прочитайте / интерпретируйте EL и попытайтесь применить это к JSON объекту. Насколько я понимаю, все это будет довольно дорого (но у Balus C может быть другая идея)

New JSON EL Resolver
Второй, немного лучшее решение - преобразование String в JSON объект по вашему выбору (их много в Java, включая стандартизированный 'JSON -P', начиная с Java EE 7 и более новой версии для Java EE 8). Насколько я знаю, по умолчанию нет включенного распознавателя EL, который знает, как обрабатывать их в EL, но существует примеров для нестандартизированных форматов EL Хотя понятия не имею, как это будет работать, тестирование знает.

Существующий EL Resolver
Третий вариант - преобразовать JSON в объекты со строгой типизацией и затем воздействовать на них обычными существующими определителями. Это могут быть существующие по умолчанию типы java, такие как Map, List, String и другие нормальные значения, но это может быть даже более строго типизированный, например, Person, Order, преобразование строк JSON в строго Типизированный объект был функцией, которая существовала в нестандартизированных библиотеках JSON, но не по умолчанию Java (EE) до Java EE 8, JSON -B. Это дает дополнительное преимущество, заключающееся в том, что завершение кода работает и проверки выполняются в IDE

О решениях для записи ...

Поскольку вы, похоже, хотите чтобы записать результаты обратно в строку JSON (у вас есть входные данные в вашем примере), первое решение для чтения очень сложно распространить на запись, и, если возможно, оно полностью лишит преимущества, которое вы, похоже, хотите получить от не писать код, чтобы иметь возможность использовать это. Второе и третье решения могут работать, но третье имеет преимущество в том, что могут быть реализованы проверки входных данных, такие как проверка bean-компонентов и многое другое.

0 голосов
/ 01 мая 2020

создайте класс:

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

Используйте его в x html

<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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...