问题描述
给出如下json,payload
对象的结构将有所不同:
{
"id": 1,"displayName": "Success","payload": {
"someProperty": "example","someOtherProperty": {
"somenestedProperty": "example"
}
}
}
...使用kotlinx.serialization
如何将其反序列化为以下数据类,其中payload
的值应为有效负载对象的原始json字符串。
@Serializable
data class Stub(
val id: Int,val displayName: String,val payload: String
)
解决方法
努力寻找一种使用序列化器实现此目的的方法,但是它很简单,可以使用'use strict';
const html = `
<!doctype html>
<html>
<head><meta charset='UTF-8'><title>Test</title></head>
<body>
<div class="class1" data-id="id1">
<span class="class2">
"text1"
</span>
</div>
<div class="class1" data-id="id2">
<span class="class2">
"text2"
</span>
</div>
<div class="class1" data-id="id1">
<span class="class2">
"text1"
</span>
</div>
<div class="class1" data-id="id3">
<span class="class2">
"text3"
</span>
</div>
</body>
</html>`;
const puppeteer = require('puppeteer');
(async function main() {
try {
const browser = await puppeteer.launch();
const [page] = await browser.pages();
await page.goto(`data:text/html,${html}`);
// Way 1.
{
const allClass1InPage = await page.$$(".class1");
for (const class1El of allClass1InPage) {
console.debug(await class1El.$eval(".class2",class2El =>
`${class2El.parentNode.dataset.id}: ${class2El.innerText}`
));
}
}
console.log();
// Way 2.
{
const allClass1InPage = await page.$$('.class1');
for (const class1El of allClass1InPage) {
const datasetHandle = await class1El.getProperty('dataset');
const idHandle = await datasetHandle.getProperty('id');
const id = await idHandle.jsonValue();
const spanHandle = await class1El.$('.class2');
const textHandle = await spanHandle.getProperty('innerText');
const text = await textHandle.jsonValue();
console.log(`${id}: ${text}`);
}
}
console.log();
// Way 3.
{
const data = await page.evaluate(
() => [...document.querySelectorAll('.class1')].map(element =>
`${element.dataset.id}: ${element.querySelector('.class2').innerText}`)
);
console.log(data.join('\n'));
}
await browser.close();
} catch (err) {
console.error(err);
}
})();
手动实现。
JsonElement
)