第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

除了 Jackson 之外,還有其他東西可以用 Java 處理復(fù)雜的對象嗎?

除了 Jackson 之外,還有其他東西可以用 Java 處理復(fù)雜的對象嗎?

炎炎設(shè)計 2022-06-15 16:27:15
我必須能夠在后端接收/發(fā)送一個JSON結(jié)構(gòu),如下面的那個。{     "firstObject":{        "type":"string",      "value":"productValue"   },   "secondObject":{        "type":"string",      "value":"statusValue"   },   "thirdObject":{        "type":"map",      "value":{           "customerName":{              "type":"string",            "value":"customerValue"         }      }   },   "fourthObject":{        "type":"map",      "value":{           "firstObject":{              "type":"map",            "value":{                 "anotherObj1":{                    "type":"string",                  "value":"TEST"               },               "anotherObj2":{                    "type":"date",                  "value":"01/12/2018"               },               "anotherObj3":{                    "type":"date",                  "value":"31/01/2018"               }            }         }      }   }}讓這有點棘手的問題是,對于每個對象,我必須知道它的類型是什么??赡苡?種類型:整數(shù)細繩布爾值地圖如果一個對象的值是map(由客戶選擇的),例如,在前端會出現(xiàn)另一個鍵/值結(jié)構(gòu),所以我在后端會收到一個動態(tài)結(jié)構(gòu)。我需要對此結(jié)構(gòu)進行驗證,以檢查它是否符合我期望收到的內(nèi)容。如果我應(yīng)該只使用一個Java類來制作我需要的對象,或者除此之外使用Jackson來JSON驗證并將所有這些對象映射到JSON.如果我要使用 Jackson,我將不得不制作一個自定義的序列化器和反序列化器。
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經(jīng)驗 獲得超9個贊

您可以從Jackson庫中使用JsonTypeInfoJsonSubTypes注釋。它們是句柄多態(tài)類型處理:

  • @JsonTypeInfo用于指示序列化中包含哪些類型信息的詳細信息

  • @JsonSubTypes用于表示注解類型的子類型

  • @JsonTypeName用于定義用于注釋類的邏輯類型名稱

您的示例適合此解決方案,除了看起來更像簡單POJO類的根對象。在您的情況下,我們應(yīng)該創(chuàng)建有助于使用以下 3 種類型的類型結(jié)構(gòu):stringdatemap:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type")

@JsonSubTypes({

    @JsonSubTypes.Type(value = StringValue.class, name = "string"),

    @JsonSubTypes.Type(value = DateValue.class, name = "date"),

    @JsonSubTypes.Type(value = MapValue.class, name = "map")

})

abstract class HasValue<T> {


    protected T value;


    public HasValue() {

        this(null);

    }


    public HasValue(T value) {

        this.value = value;

    }


    public T getValue() {

        return value;

    }


    public void setValue(T value) {

        this.value = value;

    }


    @Override

    public String toString() {

        return getClass().getSimpleName() + "{" +

            "value=" + value +

            "}";

    }

}


class StringValue extends HasValue<String> {


    public StringValue() {

        this(null);

    }


    public StringValue(String value) {

        super(value);

    }

}


class DateValue extends HasValue<String> {


    public DateValue(String value) {

        super(value);

    }


    public DateValue() {

        this(null);

    }

}


class MapValue extends HasValue<Map<String, HasValue>> {


    public MapValue(Map<String, HasValue> value) {

        super(value);

    }


    public MapValue() {

        this(new LinkedHashMap<>());

    }


    public void put(String key, HasValue hasValue) {

        this.value.put(key, hasValue);

    }

}

現(xiàn)在,我們需要引入POJO根值。它可能如下所示,但您可以根據(jù)需要添加 getter/setter。對于這個例子,下面的代碼就足夠了:


class Root {


    public HasValue firstObject;

    public HasValue secondObject;

    public HasValue thirdObject;

    public HasValue fourthObject;


    @Override

    public String toString() {

        return "Root{" +

            "firstObject=" + firstObject +

            ", secondObject=" + secondObject +

            ", thirdObject=" + thirdObject +

            ", fourthObject=" + fourthObject +

            '}';

    }

}

現(xiàn)在,我們終于可以嘗試序列化和反序列化這些對象了:


MapValue customerName = new MapValue();

customerName.put("customerName", new StringValue("customerValue"));


MapValue innerMap = new MapValue();

innerMap.put("anotherObj1", new StringValue("TEST"));

innerMap.put("anotherObj2", new DateValue("01/12/2018"));

innerMap.put("anotherObj3", new DateValue("31/01/2018"));


MapValue fourthObject = new MapValue();

fourthObject.put("firstObject", innerMap);


Root root = new Root();

root.firstObject = new StringValue("productValue");

root.secondObject = new StringValue("statusValue");

root.thirdObject = customerName;

root.fourthObject = fourthObject;


ObjectMapper mapper = new ObjectMapper();

String json = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(root);

System.out.println(json);

System.out.println(mapper.readValue(json, Root.class));

Aboce 代碼打印JSON:


{

  "firstObject" : {

    "type" : "string",

    "value" : "productValue"

  },

  "secondObject" : {

    "type" : "string",

    "value" : "statusValue"

  },

  "thirdObject" : {

    "type" : "map",

    "value" : {

      "customerName" : {

        "type" : "string",

        "value" : "customerValue"

      }

    }

  },

  "fourthObject" : {

    "type" : "map",

    "value" : {

      "firstObject" : {

        "type" : "map",

        "value" : {

          "anotherObj1" : {

            "type" : "string",

            "value" : "TEST"

          },

          "anotherObj2" : {

            "type" : "date",

            "value" : "01/12/2018"

          },

          "anotherObj3" : {

            "type" : "date",

            "value" : "31/01/2018"

          }

        }

      }

    }

  }

}

和toString表示:


Root{firstObject=StringValue{value=productValue}, secondObject=StringValue{value=statusValue}, thirdObject=MapValue{value={customerName=StringValue{value=customerValue}}}, fourthObject=MapValue{value={firstObject=MapValue{value={anotherObj1=StringValue{value=TEST}, anotherObj2=DateValue{value=01/12/2018}, anotherObj3=DateValue{value=31/01/2018}}}}}}

您可以通過添加/刪除任何類型的HasValue實例輕松地操作輸出。


查看完整回答
反對 回復(fù) 2022-06-15
?
MMMHUHU

TA貢獻1834條經(jīng)驗 獲得超8個贊

從這里下載 JSON jar 。從客戶端使用 json.stringify 將您的 JSON 轉(zhuǎn)換為字符串(因為 JSONObject 的構(gòu)造函數(shù)只接受字符串)。收到客戶端的請求后,執(zhí)行以下操作:


public void doPost(request,response) throws ParseException, JSONException {

        parseMapFromJSON(request.getParameter("JSONFromClient"));

}

private void parseMapFromJSON(String JSONParam) throws JSONException

{

    JSONObject requestJSON = new JSONObject(JSONParam);

    for(int i=0; i<requestJSON.length();i++)

    {

         String key = (String) requestJSON.names().get(i);             

         if(key.endsWith("Object"))

         {

            parseMapFromJSON(requestJSON.get(key).toString());

         }

         else if(key.startsWith("type") && (requestJSON.get(key).equals("date") || requestJSON.get(key).equals("string")))

         {

            System.out.println(requestJSON.get("value"));

            break;

         }

         else if(key.startsWith("type") && requestJSON.get(key).equals("map"))

         {

            parseMapFromJSON(requestJSON.get("value").toString());

         }

         else if(!key.equals("value"))

         {

            parseMapFromJSON(requestJSON.get(key).toString());

         }

    }

}


查看完整回答
反對 回復(fù) 2022-06-15
  • 2 回答
  • 0 關(guān)注
  • 112 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號