В jsonpath, как поставить новое значение для вложенного json объекта? - PullRequest
0 голосов
/ 28 января 2020

У меня есть Json, как это:

{
  "attachments": [
    "string"
  ],
  "contact": {
    "name": "Mahesh"
  },
  "contactCode": "C-0000001",
  "journalEntryCode": "JE-0000002",
  "linkedDocuments": [
    {
      "contactCode": "C-0000001",
      "documentCode": "0000018",
      "documentItemDetails": [
        {
          "productCode": "P-0000001"
        }
      ],
      "documentType": "QUOTATION",
    }
  ],
  "taxAmount": 2.322,
  "totalAmount": 12.322,
  "unitPriceGstInclusive": false
}

В «связанных документах» я хочу поставить / заменить новое значение «1234» для «documentCode» Я попытался следовать, взяв json путь:

JSONObject requestParams = Utilities.readJSON("createInvoiceFromQuote.json");

        requestParams.put("$.linkedDocuments[*].documentCode", "1234");

Но это просто создание нового поля "$ .linkedDocuments [*]. DocumentCode" в конце json как это

{
  "attachments": [
    "string"
  ],
  "contact": {
    "name": "Mahesh"
  },
  "contactCode": "C-0000001",
  "journalEntryCode": "JE-0000002",
  "linkedDocuments": [
    {
      "contactCode": "C-0000001",
      "documentCode": "0000018",
      "documentItemDetails": [
        {
          "productCode": "P-0000001"
        }
      ],
      "documentType": "QUOTATION",
    }
  ],
  "taxAmount": 2.322,
  "totalAmount": 12.322,
  "unitPriceGstInclusive": false
  "$.linkedDocuments[*].documentCode":"1234"
}

Это должно быть так

{
  "attachments": [
    "string"
  ],
  "contact": {
    "name": "Mahesh"
  },
  "contactCode": "C-0000001",
  "journalEntryCode": "JE-0000002",
  "linkedDocuments": [
    {
      "contactCode": "C-0000001",
      "documentCode": "1234",
      "documentItemDetails": [
        {
          "productCode": "P-0000001"
        }
      ],
      "documentType": "QUOTATION",
    }
  ],
  "taxAmount": 2.322,
  "totalAmount": 12.322,
  "unitPriceGstInclusive": false
}

Как поместить / заменить значение вложенного поля, используя java?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Так как relatedDocuments является JSONArray для JSONObject, поэтому ключ "$ .linkedDocuments [*]. DocumentCode" не будет работать должным образом. Чтобы обновить любой ключ JSONObject в JSONArray, откройте JOSNArray и выполните итерацию для всего JSONObject, а затем выполните обновление.

String str = "{\"attachments\":[\"string\"],\"contact\":{\"name\":\"Mahesh\"},\"contactCode\":\"C-0000001\",\"journalEntryCode\":\"JE-0000002\",\"linkedDocuments\":[{\"contactCode\":\"C-0000001\",\"documentCode\":\"0000018\",\"documentItemDetails\":[{\"productCode\":\"P-0000001\"}],\"documentType\":\"QUOTATION\"},{\"contactCode\":\"C-0000002\",\"documentCode\":\"0000019\",\"documentItemDetails\":[{\"productCode\":\"P-0000002\"}],\"documentType\":\"QUOTATION\"}],\"taxAmount\":2.322,\"totalAmount\":12.322,\"unitPriceGstInclusive\":false}";

JSONObject jsonObject = new JSONObject(str);

JSONArray array = jsonObject.getJSONArray("linkedDocuments");
array.getJSONObject(0).put("documentCode", 1234);
System.out.println(jsonObject);

Вывод:

{
  "linkedDocuments": [
    {
      "documentCode": 1234,
      "contactCode": "C-0000001",
      "documentType": "QUOTATION",
      "documentItemDetails": [
        {
          "productCode": "P-0000001"
        }
      ]
    },
    {
      "documentCode": "0000019",
      "contactCode": "C-0000002",
      "documentType": "QUOTATION",
      "documentItemDetails": [
        {
          "productCode": "P-0000002"
        }
      ]
    }
  ],
  "totalAmount": 12.322,
  "attachments": [
    "string"
  ],
  "contactCode": "C-0000001",
  "contact": {
    "name": "Mahesh"
  },
  "journalEntryCode": "JE-0000002",
  "taxAmount": 2.322,
  "unitPriceGstInclusive": false
}
1 голос
/ 28 января 2020

Вам необходимо внести незначительные исправления в ваш код.

JSONObject requestParams = Utilities.readJSON("createInvoiceFromQuote.json");
JSONArray linkedDocuments = requestParams.getJSONArray("linkedDocuments");
JSONObject document = linkedDocuments.getJSONObject(0) 
document.put("documentCode", 1234);

Вывод

{
  "attachments": [
    "string"
  ],
  "contact": {
    "name": "Mahesh"
  },
  "contactCode": "C-0000001",
  "journalEntryCode": "JE-0000002",
  "linkedDocuments": [
    {
      "contactCode": "C-0000001",
      "documentCode": "1234",
      "documentItemDetails": [
        {
          "productCode": "P-0000001"
        }
      ],
      "documentType": "QUOTATION",
    }
  ],
  "taxAmount": 2.322,
  "totalAmount": 12.322,
  "unitPriceGstInclusive": false
}
...