使用包含DOT符号的元素名称的变量动态创建JSON



我在Azure Blob存储中有2个CSV文件,我正在使用C#解析这些文件

  • 第一个CSV文件是一个小文件,该文件包含从第二个CSV文件中的数据映射到API的映射,记录看起来像下面的
csvField1, apiField1.subfield1
csvField2, apiField2
csvField3, apiField5
csvField6, apiField1.subfield2
  • 第二个CSV文件很大,因此我将使用stream读取它,并且该文件具有带有以下列名称的标题CSVFIELD1,CSFFIELD2,CSVFIELD4,CSFFIELD5,CSVFIELF6,CSFFIELD7

我希望输出像以下

这样的JSON
{
   apiField1:{
       subfield1: value(csvField1)
       subfield2: value(csvField6)
   },
   apiField2:value(csvField2),
   apiField5: value(csvField3)
}

使用newtonsoft.json库的可行解决方案:

a(为apifield1

创建数据类
class ApiField1
{
    public ApiField1(string s1, string s2)
    {
        subfield1 = s1;
        subfield2 = s2;
    }
    public string subfield1 { get;}
    public string subfield2 { get;}
}

b(为API记录创建数据类

class ApiRecord
{
    public ApiRecord(string[] s)
    {
        apiField1 = new ApiField1(s[0], s[5]);
        apiField2 = s[1];
        apiField5 = s[2];
    }
    public ApiField1 apiField1 { get; }
    public string apiField2 { get; }
    public string apiField5 { get; }
}

c(测试

class Program
{
    static void Main(string[] args)
    {
        ApiRecord a = new ApiRecord("0,1,2,3,4,5".Split(','));
        Console.WriteLine(JsonConvert.SerializeObject(a));
        Console.ReadLine();
    }
}

结果:

{"apiField1":{"subfield1":"0","subfield2":"5"},"apiField2":"1","apiField5":"2"}

我只是用简单的字符串" 0,1,2,3,4,5"测试。在您的情况下,您可以从CSV文件的流中读取每一行。

或,您可以使用字典:

Dictionary<string, String> apidield1 = new Dictionary<string, string>();
apidield1.Add("subfield1", "value(csvField1)");
apidield1.Add("subfield2", "value(csvField6)");
Dictionary<string, Object> apiRecord = new Dictionary<string, object>();
apiRecord.Add("apiField2", "value(csvField2)");
apiRecord.Add("apiField5", "value(csvField3)");
apiRecord.Add("apiField1", apidield1);
Console.WriteLine(JsonConvert.SerializeObject(apiRecord));

输出:

{"apiField2":"value(csvField2)","apiField5":"value(csvField3)","apiField1":{"subfield1":"value(csvField1)","subfield2":"value(csvField6)"}}

最新更新