簡體   English   中英

將兩個Java數組合並為一個json字符串

[英]Merge two java arrays to a single json string

我正在根據代碼中的信息創建兩個不同的數組。 我需要將兩者合並(合並)並產生一個json對象,以傳遞給其他方法。 我更喜歡使用gson,因為我正在使用那些

我正在使用gson,並且嘗試了許多不同的方法,我完全迷失了。 有什么幫助嗎?

注意:我嘗試將mList添加到asMap,

asMap.putAll(mList);

但是得到

putAll (java.util.Map<? extends java.lang.String,? extends java.lang.string>) in Map cannot be applied to (java.util.List <java.util.Map<java.lang.String,java.lang.String>>)

我有一個數組:

Map<String, String> asMap = new HashMap<>();

看起來像:

{
    "batchId":"25248e931e5948b990f528d26ee6a9f5",
    "almServer":"server.com",
    "almDomain":"EBUSINESS",
    "almProject":"STERLING",
    "testSetUrl":"http://test.com",
    "testParameters":"{\"browser\":\"chrome\",\"browser-version\":\"56\",\"language\":\"english\",\"country\":\"USA\"}",
    "startTime":"01/20/2018 06:37:05 PM",
    "finishTime":"01/21/2018 05:30:25 AM",
    "totalDuration":"10h 53m 19s 922ms",
    "passed":159,
    "testsExecuted":214,
    "failed":52,
    "notCompleted":3,
    "testPassPercentage":"75.4"
}

一秒:

List<Map<String, String>> mList = new ArrayList<Map<String, String>>();

看起來像:

[
    {
        "runDuration":"9m 33s 642ms",
        "testId":"12100",
        "automatedTest":"CancelFullOrder",
        "batchItemPosition":"1",
        "runPosition":"1",
        "executionDate":"01/21/2018",
        "executionTime":"02:48:50 AM",
        "runId":"69257",
        "status":"PASSED"
    },
    {
        "runDuration":"8m 56s 991ms",
        "testId":"12101",
        "automatedTest":"CancelOrderPartially",
        "batchItemPosition":"2",
        "runPosition":"1",
        "executionDate":"01/21/2018",
        "executionTime":"02:49:30 AM",
        "runId":"69258",
        "status":"PASSED"
    }
]

我想將它們組合成一個看起來像這樣的jsonobject:

{
    "batchId":"25248e931e5948b990f528d26ee6a9f5",
    "almServer":"server.com",
    "almDomain":"EBUSINESS",
    "almProject":"STERLING",
    "testSetUrl":"http://test.com",
    "testParameters":"{\"browser\":\"chrome\",\"browser-version\":\"56\",\"language\":\"english\",\"country\":\"USA\"}",
    "executedTests":[
        {
            "runDuration":"9m 33s 642ms",
            "testId":"12100",
            "automatedTest":"CancelFullOrder",
            "batchItemPosition":"1",
            "runPosition":"1",
            "executionDate":"01/21/2018",
            "executionTime":"02:48:50 AM",
            "runId":"69257",
            "status":"PASSED"
        },
        {
            "runDuration":"8m 56s 991ms",
            "testId":"12101",
            "automatedTest":"CancelOrderPartially",
            "batchItemPosition":"2",
            "runPosition":"1",
            "executionDate":"01/21/2018",
            "executionTime":"02:49:30 AM",
            "runId":"69258",
            "status":"PASSED"
        }
        ],
    "startTime":"01/20/2018 06:37:05 PM",
    "finishTime":"01/21/2018 05:30:25 AM",
    "totalDuration":"10h 53m 19s 922ms",
    "passed":159,
    "testsExecuted":214,
    "failed":52,
    "notCompleted":3,
    "testPassPercentage":"75.4"
}

在您的問題和對問題的回答中,似乎是您自己構建這些結構並可以更改它們的定義。 正如注釋中所指出的那樣,問題在於您的頂層結構(即HashMap)的值類型為String。 由於要添加列表作為值,因此必須將HashMap值的類型概括為Object:

Map<String, Object> asMap = new HashMap<>();

如果您要自己構建HashMap,則在構建Map時應該已經可以使用此新定義。 但是,如果您已經有了Map<String, String> ,則可以使用以下方法強制將其強制轉換為Map<String, Object>

@SuppressWarnings("unchecked")
Map<String, Object> topMap = (Map<String, Object>) (Map<String, ?>) asMap;

(也許有一種更好的方法可以做到這一點。Java無法假設,因為String是Object的子類,所以可以進行這種強制轉換。為什么需要兩次強制轉換才能完成這項工作,這超出了我的理解。)

然后,將它們結合起來:

asMap.put("executedTests", mList);

或如果您使用上面的asMap則用asMap替代topMap

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM