杰克逊错过了价值观

时间:2019-01-23 11:37:33

标签: java json jackson

我正在尝试将JSON映射到简单的Java DTO。
这是我的Java结构:

public class VirtualServerResponse {
    private String kind;
    private String selfLink;
    private List<VirtualServer> items = new ArrayList<VirtualServer>();
    //no arg constructor
    //getters and setters

@JsonIgnoreProperties(ignoreUnknown = true)
public class VirtualServer {
    public String kind;
    public String name;
    public String partition;
    public String fullPath;
    public String generation;
    public String selfLink;
    public String addressStatus;
    public String autoLasthop;
    public String cmpEnabled;
    public String connectionLimit;
    public String description;
    public String destination;
    public String enabled;
    public String gtmScore;
    public String ipProtocol;
    public String mask;
    public String mirror;
    public String mobileAppTunnel;
    public String nat64;
    public String pool;
    public String rateLimit;
    public String rateLimitDstMask;
    public String rateLimitMode;
    public String rateLimitSrcMask;
    public String serviceDownImmediateAction;
    public String source;
    public String sourcePort;
    public String synCookieStatus;
    public String translateAddress;
    public String translatePort;
    public String vlansEnabled;
    public String vsIndex;
    public PoolDTO assignedPool;

    public VirtualServer() {
    }
    //getters and setters

以下是应映射的JSON:

"kind":"tm:ltm:virtual:virtualcollectionstate",
   "selfLink":"https://localhost/mgmt/tm/ltm/virtual?expandSubcollections=true&ver=13.1.1.2",
   "items":[
      {
         "kind":"tm:ltm:virtual:virtualstate",
         "name":"some_name_with:80",
         "partition":"part",
         "fullPath":"/part/name",
         "generation":58670,
         "selfLink":"https://localhost/mgmt/tm/ltm/virtual/~somelink",
         "addressStatus":"yes",
         "autoLasthop":"default",
         "cmpEnabled":"yes",
         "connectionLimit":0,
         "description":"description",
         "destination":"/part/1.1.1.1:80",
         "enabled":true,
         "gtmScore":0,
         "ipProtocol":"tcp",
         "mask":"255.255.255.255",
         "mirror":"disabled",
         "mobileAppTunnel":"disabled",
         "nat64":"disabled",
         "pool":"/pool",
         "poolReference":{
            "link":"https://localhost/mgmt/tm/ltm/pool/link"
         },
         "rateLimit":"disabled",
         "rateLimitDstMask":0,
         "rateLimitMode":"object",
         "rateLimitSrcMask":0,
         "serviceDownImmediateAction":"none",
         "source":"0.0.0.0/0",
         "sourceAddressTranslation":{
            "type":"automap"
         },
         "sourcePort":"preserve",
         "synCookieStatus":"not-activated",
         "translateAddress":"enabled",
         "translatePort":"enabled",
         "vlansEnabled":true,
         "vsIndex":137,
         "vlans":[
            "/LAN"
         ],
         "vlansReference":[
            {
               "link":"https://localhost/mgmt/tm/net/vlan/~LAN?ver=13.1.1.2"
            }
         ],
         "policiesReference":{
            "link":"https://localhost/mgmt/tm/ltm/virtual/policie",
            "isSubcollection":true
         },
         "profilesReference":{
            "link":"https://localhost/mgmt/tm/ltm/virtual/~name",
            "isSubcollection":true,
            "items":[
               {
                  "kind":"tm:ltm:virtual:profiles:profilesstate",
                  "name":"stats",
                  "partition":"part",
                  "fullPath":"/part/stats",
                  "generation":3,
                  "selfLink":"https://localhost/mgmt/tm/ltm/virtual/~name",
                  "context":"all",
                  "nameReference":{
                     "link":"https://localhost/mgmt/tm/ltm/profile/statistics/~part~stats?ver=13.1.1.2"
                  }
               },
               {
                  "kind":"tm:ltm:virtual:profiles:profilesstate",
                  "name":"tcp",
                  "partition":"part",
                  "fullPath":"/part/tcp",
                  "generation":58670,
                  "selfLink":"https://localhost/mgmt/tm/ltm/virtual/~name",
                  "context":"all",
                  "nameReference":{
                     "link":"https://localhost/mgmt/tm/ltm/profile/tcp/~part~tcp?ver=13.1.1.2"
                  }
               }
            ]
         }
      }, ... next item

整个JSON都在一行中映射了JSON:

while ((line = br.readLine()) != null) {
    this.jsonResponse = m.readValue(line, VirtualServerResponse.class);
}

我不需要item中的所有子项,因此我使用了JsonIgnoreUnknown来释放它们。但是,只有少数几个属性被映射:
 种类,名称,分区,fullPath,生成,selfLink和描述。

所有其他均为空。有人可以帮我吗?

1 个答案:

答案 0 :(得分:1)

似乎有不同级别的属性。

您已将对象的所有属性直接映射到根目录下,因此所有其他嵌套属性都不可见。

如果json类似于:

ComponentName cn = new ComponentName(context, CustomNotificationListenerService.class);
String flat = Settings.Secure.getString(context.getContentResolver(), "enabled_notification_listeners");
return flat != null && flat.contains(cn.flattenToString());

您需要将其映射到类似于以下内容的对象:

{
   "kind":"tm:ltm:virtual:virtualcollectionstate",
   "selfLink":"https://localhost/mgmt/tm/ltm/virtual?expandSubcollections=true&ver=13.1.1.2",
   "items":[
      {
        "kind":"tm:ltm:virtual:virtualstate",
        "name":"some_name_with:80",
        "partition":"part",
        "fullPath":"/part/name",
        ...
      }
   ]
}