jackson 如何在自定义java类中表示递归json元素

ct2axkht  于 2022-11-09  发布在  Java
关注(0)|答案(1)|浏览(123)

我有下面的json,我试图找出定制的java类可以代表哪种结构。

{
   "04000550":{
      "vr":"SQ",
      "Value":[
         {
            "00100010":{
               "vr":"PN",
               "Value":[
                  {
                     "Alphabetic":"TCGA-17-Z021"
                  }
               ]
            }
         }
      ]
   },
   "04000562":{
      "vr":"DT",
      "Value":[
         "20220103125232.022"
      ]
   },
   "04000563":{
      "vr":"LO",
      "Value":[
         "dcm4chee-arc"
      ]
   },
   "04000564":{
      "vr":"LO"
   },
   "04000565":{
      "vr":"CS",
      "Value":[
         "CORRECT"
      ]
   }
}

我尝试了Map<String, Tag>,自定义类Tag具有vr and Value属性,问题是Value可以是list of one String,也可以是Tag,这取决于vr属性(如果vr =“SQ”,则值将是Tag类型)
我尝试将此jsonMap到一个适当的java数据结构,以便在primefaces datatable中使用它来表示表中的这些数据,以便用户编辑它们。如果我将此json表示为Map<String, Tag>,并且Tag具有String vr, JsonNode Value,我将无法允许在primefaces datatable中编辑此值,因为它需要将Value作为自定义对象,该对象具有允许对其进行setter和getter的属性(这是jsf或primefaces的工作方式),那么我如何Map这个json呢?
这是我的第一张脸。

abithluo

abithluo1#

您可以使用Custom Deserializer for Jackson,然后反序列化JSON,如下所示:

ObjectMapper mapper = new ObjectMapper();
Map<String, Tag> tagMap = mapper.readValue(json, new TypeReference<>() {});

我试着做一个deserializer。它很脏,但正在工作。
POJO类将如下所示:

@JsonDeserialize(using = TagDeserializer.class)
public class Tag {
     public final String type;
     // For other types
     public final List<String> valueList;
     // For `SQ` type
     public final Map<String, NestedTag> tags;

     // AllArgsConstructor, Getters
}

public class NestedTag {
     public final String type;
     public final Map<String, String> valueMap;

     // AllArgsConstructor, Getters
}

dataTable将如下所示:

<p:dataTable value="#{tagController.tagMap.entrySet()}" var="entry">
    <p:column headerText="Id">
        <p:outputLabel value="#{entry.key}"/>
    </p:column>

    <p:column headerText="Type">
        <p:inputText value="#{entry.value.type}"/>
    </p:column>

    <p:column headerText="Value">
            <!--   List.toString(), you can replace it with another p:dataTable   -->
        <p:inputText value="#{entry.value.valueList}" rendered="#{entry.value.valueList != null}"/>

        <p:dataTable value="#{entry.value.tags.entrySet()}" var="nestedTag" rendered="#{entry.value.tags != null}">
            <p:column headerText="Id">
                <h:outputLabel value="#{nestedTag.key}"/>
            </p:column>

            <p:column headerText="Type">
                <p:inputText value="#{nestedTag.value.type}"/>
            </p:column>

            <p:column headerText="Value">
                    <!--   Map.toString(), you can replace it with another p:dataTable   -->
                <p:inputText value="#{nestedTag.value.valueMap}"/>
             </p:column>
        </p:dataTable>

    </p:column>

</p:dataTable>

相关问题