如何序列化两个参数Json转换?

Posted

技术标签:

【中文标题】如何序列化两个参数Json转换?【英文标题】:How to serialize two parameter Json convert? 【发布时间】:2017-12-29 17:21:46 【问题描述】:

我有一个 xamarin 表单应用程序和一个使用 ASP.net 创建的 REST Web api。 Web api 正在远程服务器上运行。在那个 web api 中,我有用于数据库查询的类。我需要将服务器地址、用户名、密码和数据库名称作为连接字符串从我的 xamarin 应用程序传递到该特定类。如何同时序列化连接字符串和对象?

我的数据库查询

public void addSalesReport(string connstr, SalesReport salesreport)
    

        mysqlConnection myconn = new MySqlConnection(connstr);
        string d = salesreport.Date.ToString("yyyy-MM-dd");

        String sqlstr = "INSERT INTO salesreport (ID,sDate,ColorCopy,BwCopy,4RPrints,Misc,ExternalOrder,TotalSales,BwWastage,ColorWastage,Remarks) VALUES ('" + salesreport.ID + "','" + d + "'," + salesreport.ColorCopy + "," + salesreport.BwCopy + "," + salesreport.p4rPrint + "," + salesreport.Misc + ","+salesreport.ExternalOrder+","+salesreport.TotalSales+","+salesreport.BwWastage+","+salesreport.ColorWastage+",'"+salesreport.Remarks+"')";
        MySqlCommand cmd = new MySqlCommand(sqlstr, myconn);
        myconn.Open();
        cmd.ExecuteNonQuery();
        myconn.Close();
        myconn.Dispose();

    

将数据发布到 Mysql db 的控件

 [HttpPost]
    [Route("api/SalesReport", Name = "salesReport")]
    public void PostUpdate([FromBody]string connstr , SalesReport value)
    
        SalesDBConn db = new SalesDBConn();
        db.addSalesReport(connstr, value);
    

我的 Xamarin 应用程序中的数据服务类

public async void addSalesReport(string connstr, SalesReport salesReport)
    
        var conn = JsonConvert.SerializeObject(connstr);
        var contentstr = new StringContent(conn, Encoding.UTF8, "application/json");

        var data = JsonConvert.SerializeObject(salesReport);
        var content =  new StringContent(data, Encoding.UTF8, "application/json");

        var response = await client.PostAsync("http://myserverdomain.com/api/SalesReport", contentstr, content);

    

【问题讨论】:

我在等待 client.PostAsync("myserverdomain.com/api/SalesReport", contentstr, content);无法从 system.net.http.stringContent 转换为 System.Threading,CancellationToken 我没有看到client 对象的类型?它是在addSalesReport 方法之外定义的吗? 是的,它在外面。 【参考方案1】:

首先,我们将不得不引入一个新类,它将充当您的两个输入的包装容器。现在,每当我们序列化类时,两个输入都会一起序列化:

public class DataToPost

    public string ConnectionString  get; set; 
    public SalesReport SalesReportData  get; set; 

然后改addSalesReport方法如下面代码sn-p所示:

public async void addSalesReport(string connstr, SalesReport salesReport)

    HttpClient client = new HttpClient();

    var objectDataToPost = new DataToPost  ConnectionString = connstr, SalesReportData = salesReport ;
    var data = JsonConvert.SerializeObject(objectDataToPost);
    var content = new StringContent(data, Encoding.UTF8, "application/json");
    
    var response = await client.PostAsync("http://myserverdomain.com/api/SalesReport", content, CancellationToken.None);


【讨论】:

【参考方案2】:

所以您要将连接到您的数据库的字符串嵌入到您的客户端中?这听起来是个非常糟糕的主意。

无论如何,如果您想在一个 HTTP 请求中发送多个数据片段,那么您可以将其包装在一个容器中,该容器包含每个数据片段的成员:


    "connectionString" : "just-don't-do-that",
    "data" : 
        // the rest of the data
    

【讨论】:

这个应用程序会在一个小圈子内使用,客户端需要输入连接字符串,它会保存在一个xml文件中。稍后,来自 xml 文件的数据将用于设置连接字符串。这就是要求。这就是我这样做的原因,还有其他方法吗?【参考方案3】:

我同意@CodeCaster,从客户端发送连接字符串真的很糟糕。

要从客户端发送多个参数,我们需要有容器,我的意思是更新您的:

1) 我的 Xamarin 应用程序中的数据服务类

public async void addSalesReport(string connstr, SalesReport salesReport)

    var data = connstr: connstr,salesReport:salesReport

    var content =  new StringContent(data, Encoding.UTF8, "application/json");

    var response = await client.PostAsync("http://myserverdomain.com/api/SalesReport", content);


2) 和 Control 将数据发布到 Mysql db

[Route("api/SalesReport", Name = "salesReport")]
public void PostUpdate([FromBody]SalesReportData value)

    SalesDBConn db = new SalesDBConn();
    db.addSalesReport(value.connectionString, value.SalesReport);


//rename the class 
public class SalesReportData
public string connectionString get; set; 
public string SalesReport get; set; 

希望对你有帮助... :)

【讨论】:

以上是关于如何序列化两个参数Json转换?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 字符串转换为 URL 参数(GET 请求)?

如何配置 web api 的 json 序列化器将日期时间转换为 ISO 8601 格式?

数据类中的默认参数未使用 ktor 序列化程序转换为 json

.net core post自带的json序列化转换出错 post参数为null

.net core post自带的json序列化转换出错 post参数为null

如何确定两个优先于重载解析的隐式转换序列?