【问题标题】:How do I generate specific JSON output from VB.Net?如何从 VB.Net 生成特定的 JSON 输出?
【发布时间】:2017-06-08 14:22:21
【问题描述】:

作为一名使用 VB.Net 2015 社区的 VB.Net 程序员,我在 C# 中遇到了需要转换为 VB 的项目,但这次我不明白我在使用什么。我正在使用的网站服务返回并期望 JSON / JOBJECTS 结构,例如:

var token = new {
    iss = PARTNERID,
    product = "twpemp",
    sub = "partner",
    siteInfo = new {
        type = "id",
        id = SITEID
    },
    exp = (Int32)DateTime.UtcNow.Add(new TimeSpan(0, 4, 30)).Subtract(new DateTime(1970, 1, 1)).TotalSeconds
};

在线转换器将其转换为:

Dim EPochTime = DateTime.UtcNow.Add(New TimeSpan(0, 4, 0)).Subtract(New DateTime(1970, 1, 1)).TotalSeconds
Dim Token = New With {
    Key .iss = AccNumber,
    Key .product = "twppartner",
    Key .sub = "partner",
    Key .siteInfo = New With {
        Key .type = "id",
        Key .id = Site},
    Key .exp = EPochTime
}

我需要动态创建这种类型的结构,因为“键名”和值会根据返回的内容和需要发回的内容而变化。例如,根据上面的 siteid,返回的结构可能包含以下内容:

"Results": [
{
  "RecordNumber": 000001,
  "EmployeeCode": "0001",
  "FirstName": "John",
  "MiddleName": "A",
  "LastName": "Dow",
  "Designation": "Worker",
  "Home1": "Press",
},
{
  "RecordNumber": 000002,
  "EmployeeCode": "0002",
  "FirstName": "Jane",
  "MiddleName": "b",
  "LastName": "Dow",
  "Designation": "Helper",
  "Home1": "Office",
}
}

对于我提交查询并最终需要更新的下一个客户,可能有:

"Results": [
{
  "RecordNumber": 12345,
  "EmployeeCode": "231",
  "FirstName": "Erick",
  "MiddleName": "G",
  "LastName": "Smith",
  "Department": "Electrial",
},
{
  "RecordNumber": 732456,
  "EmployeeCode": "853",
  "FirstName": "Fred",
  "MiddleName": "W",
  "LastName": "Kerber",
  "Department": "Electrial",
}
}

两者的区别是一个有“部门”,一个没有。此结构会根据第一次调用的 siteID 发生变化。

我的主要问题是如何在 VB.NET 中动态创建类似的东西,其次,这种东西到底叫什么?我称它为缺乏更好用词的结构。

【问题讨论】:

  • 您的第二个块已经在 VB 中动态创建了,那么问题出在哪里?序列化结果是否与您需要发送的匹配?它们被称为匿名类型
  • 键名从 siteID 更改为 siteID。感谢您的类型名称,我将对此进行更多研究!弗雷德
  • 那又怎样?您只需根据需要输入不同的属性名称。基于第二部分,因为你想要一个数组(显然),我只使用一对具体的类——也许它们继承自一个具有共享部分的类。您可以像创建匿名类型一样有条件地创建类型 A 或类型 B 的集合

标签: c# json vb.net


【解决方案1】:

如果您希望以 JSON 格式输出这些内容时更灵活,有两种方法:

1) 您可以使用Dictionary<string,object> 代替动态类型。使用字典方法,您可以在运行时添加(或排除)属性。 JSON 序列化程序将以与序列化动态类型相同的方式输出。

 var dict = new Dictionary<string, object>() { { "key1", "value1"} };
 dict["key2"] = DateTime.Now();
 dict["key3"] = 1234567;
 if (someCondition){
       dict["key4"] = new Dictionary<string, object>() { { "key5", "value5"}, { "key6", "value6"}};
 }

2) 您可以创建一个具有 JSON 结构可能包含的所有可用属性的类。对于数字类型的可选属性,使它们可以为空:

public class Qwijibo 
{
    public int? RecordNumber {get;set;}
    public string EmployeeCode  {get;set;}
    public string FirstName {get;set;}
    public string MiddleName {get;set;}
    public string LastName {get;set;}
    public string Designation {get;set;}
    public string Home1 {get;set;}
    public string Department {get;set;
}

上述课程可能适用于您提出的两种情况。您未为其分配值的属性将在 JSON 中序列化为 null。只要您要传输的任何内容都不会挂在 null 值上,您就可以开始了。

【讨论】:

  • 在研究并遇到障碍后,我最终使用了字典方法,当与 Newtonsoft.Json.JsonConvert.SerializeObject 函数结合使用时,我能够读取架构,创建/修改数据为需要。真棒答案!谢谢!
猜你喜欢
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2012-02-17
  • 2016-01-30
  • 1970-01-01
  • 2020-09-04
  • 1970-01-01
相关资源
最近更新 更多