如何使用节点将表单数据(文本/纯文本)转换为 json?

Posted

技术标签:

【中文标题】如何使用节点将表单数据(文本/纯文本)转换为 json?【英文标题】:How to convert form data (text/plain) to json with node? 【发布时间】:2018-07-21 12:11:31 【问题描述】:

我需要对 API 执行 POST 调用来下订单。因此,我制作了一个简单的 Node js 应用程序。目前,在这种当前状态下,我在我们的应用程序中接收到文本/纯文本数据,但这不是 JSON 样式的。

这就是我现在拥有的:

TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=true

我想要 JSON 格式的(比如):


  "Email": "example1@1.nl",
  "Coin": "BTC",
  "CouponCode": "",
  "AmountEuro": 80.0,
  "AmountCoin": 1.0,
   "CoinPriceInEuro": 80,
  "CoinAddress": "17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M",
  "TypeOrder": "buy",
  "PaymentMethod": 1,
  "GeneralTermsAccepted": false

附上你找到的代码。

谁能告诉我必须做什么才能将其放入正确的 json 中?

const express = require('express');
const http = require('http');
const app = express();
const fs=require('fs');
const hostname = '127.0.0.1';
const port = 3000;
const bodyParser = require('body-parser');
var jsonParser = bodyParser.json()
var urlencodedParser = bodyParser.urlencoded( extended: false )

fs.readFile('index.html', (err, html) => 
	if(err) 
	    throw err;
	

	var server = http.createServer((req, res) => 
	    res.statusCode=200;
	    res.setHeader('Content-type', 'text/html');
	    res.write(html);
	    res.end();
	);

	server.listen(port, hostname, () => 
	    console.log('Server started on port'+port);
	);

	// POST /login gets urlencoded bodies
        app.post('http://localhost:3030/rest/v1/PostOrder', urlencodedParser, function (req, res) 
            console.log(req.body);
            if (!req.body) return res.sendStatus(400);
            res.send('http://localhost:3030/rest/v1/PostOrder', qs:req.query);
        );
);
<!DOCTYPE html>
<html>
<body>

<form enctype="text/plain" action="http://localhost:3030/rest/v1/PostOrder" method="POST">
  Buy/Sell:<br>
  <input type="text" name="TypeOrder" value="buy">
  <br>
  Coin:<br>
  <input type="text" name="Coin" value="BTC">

  Amount in Coin:<br>
  <input type="number" name="AmountCoin" value="1">
  <br>
  Coin Price in Euro:<br>
  <input type="number" name="CoinPriceInEuro" value="100">
  <br>
  Coin address to send:<br>
  <input type="text" name="CoinAddress" value="17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M">
  <br>
  Payment method:<br>
  <input type="radio" name="PaymentMethod" value="1" checked> iDeal<br>
  <input type="radio" name="PaymentMethod" value="2"> Credit Card<br>
  <input type="radio" name="PaymentMethod" value="3"> PayPal<br>
  <br>
  Terms accepted:<br>
  <input type="radio" name="GeneralTermsAccepted" value="true" checked>Ja<br>
  <input type="radio" name="GeneralTermsAccepted" value="false">No<br>
  <br><br>


  <input type="submit" value="Submit">
</form>

<p>If you click the "Submit" button, the form-data will be sent to a page called "/action_page.php".</p>

</body>
</htm

【问题讨论】:

【参考方案1】:

因此,您可以执行以下操作:

const data = `
    TypeOrder=buy
    Coin=BTC
    AmountCoin=1
    CoinPriceInEuro=100
    CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
    PaymentMethod=1
    GeneralTermsAccepted=true`;

let parts = data.split( '\n' );
let formattedData = ;

parts.forEach( ( part ) => 
    const splitData = part.split( '=' );
    formatterData[ splitData[ 0 ] ] = splitData[ 1 ];
 );

这是一个非常简单的方法。您可以使用大量的库使其更面向功能或更简单。 :)

【讨论】:

为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例 这只是一个示例,无论您拥有多少数据都可以使用。【参考方案2】:

无需在表单中将 enctype 指定为 text/plain。

只需正确删除它,因为您的节点应用程序已经使用 json 编码器作为中间件。

【讨论】:

【参考方案3】:

这个呢:

let str=`TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=false`;

let result=str.split('\n').reduce((re, v) => 
  let key=v.split('=')[0],val=v.split('=')[1];    
    if (val.match(/^\d+\.\d+$|^\d+$/)) 
      val=Number(val);
    else if(val.match(/^true$/i))
      val=true;
    else if(val.match(/^false$/i))
      val=false;
        
    re[key]=val;
    return re;
, );

console.log(result);

【讨论】:

为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例【参考方案4】:

正文数据由\n 分隔,因此您可以拆分然后循环该数组。

payload_template 是您的空模板,将填充正文数据。

片段

let body = `TypeOrder=buy
Coin=BTC
AmountCoin=1
CoinPriceInEuro=100
CoinAddress=17J6W29E2q94YNg5eiaHGsNWW9oJxsWu1M
PaymentMethod=1
GeneralTermsAccepted=true`;

let payload = ;
body.split('\n').forEach((c) => [key, payload[key]] = c.split('='));
console.log(payload);
.as-console-wrapper 
  max-height: 100% !important

【讨论】:

为什么要硬编码?我需要将表单数据捕获为有效负载中的 json 而不是硬编码示例 @user3394645 好的,你做动态 json 转换。请等一下!

以上是关于如何使用节点将表单数据(文本/纯文本)转换为 json?的主要内容,如果未能解决你的问题,请参考以下文章

如何将HTML转换为纯文本格式Text

如何将 HTML 文本转换为纯文本? [复制]

如何在 C# 中将 HtmlEncode/HtmlDecode 转换为纯文本?

使用主键节点将 TSQL 转换为 NoSQL

如何操作表单输入使用地理位置而不是纯文本

如何使用 PHP 在 MySQL 数据库中将纯文本 CSV 字段保存为 HTML?