C#SSIS中的JSON序列化 已解决:我不再将字符串视为数组,而是将换行分隔符添加到连接管理器中,以便将每一行视为新行。这解决了这个问题,消除了通过C#脚本处理这个问题的需要。

C#SSIS中的JSON序列化 已解决:我不再将字符串视为数组,而是将换行分隔符添加到连接管理器中,以便将每一行视为新行。这解决了这个问题,消除了通过C#脚本处理这个问题的需要。,c#,arrays,json,ssis,C#,Arrays,Json,Ssis,我构建了一个SSIS包,它使用一个C#脚本任务来反序列化JSON字符串并将其插入表中 我使用了一个JSON原型字符串: {"name":"Test 1","code":"398057008","table":"SNOMEDCT","addedby":"morgan.baxter","dateadded":1544523489235,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","

我构建了一个SSIS包,它使用一个C#脚本任务来反序列化JSON字符串并将其插入表中

我使用了一个JSON原型字符串:

{"name":"Test 1","code":"398057008","table":"SNOMEDCT","addedby":"morgan.baxter","dateadded":1544523489235,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "}],"prefix":"[C] "}
但当我尝试向JSON字符串添加第二项时,我收到一个错误:

[{"name":"Test 2","code":"398057008","table":"SNOMEDCT","addedby":"morgan.baxter","dateadded":1544523489235,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"410605003","prefix":"[C] "}],"prefix":"[C] "},{"name":"Test 2","code":"44255352","table":"SNOMEDCT","addedby":"morgan.baxter","dateadded":1544523489235,"qualifier":[{"name":"Qualifier","value":"Confirmed Diagnosis","code":"53252355","prefix":"[C] "}],"prefix":"[C] "}]
错误:

不支持“SC_8AAE66509AE4BA8491323924579173.诊断”类型 用于数组的反序列化

据我所知,这只是说我的“解析器”本质上不支持字符串中的JSON字段数组

这是我的主要代码块:

#region Namespaces
using System;
using System.Data;
using System.Collections.Generic;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Web.Script.Serialization;
using Microsoft.SqlServer.Dts.Pipeline;

namespace SC_8aae662509ae4bab8491323924579173
#endregion
{

    [Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
    public class ScriptMain : UserComponent
    {

        ///<param name="Row">The row that is currently passing through the component</param>;
        public override void Input0_ProcessInputRow(Input0Buffer Row)
        {
            JavaScriptSerializer js = new JavaScriptSerializer();

            // Give the input column a variable to make it easier to reference.
            BlobColumn combinedColumn = Row.Column0;

            // Convert from blob to string
            string reviewConverted = System.Text.Encoding.ASCII.GetString(combinedColumn.GetBlobData(0, Convert.ToInt32(combinedColumn.Length)));

            Diagnosis diagnosis = new Diagnosis();

            // Deserialize the string
            diagnosis = js.Deserialize<Diagnosis>(reviewConverted);

            // Assign values to output columns
            Row.name = diagnosis.name;
            Row.code = diagnosis.code;
            Row.table = diagnosis.table;
            Row.addedby = diagnosis.addedby;
            Row.dateadded = diagnosis.dateadded;

            Row.qualifierName = diagnosis.Qualifier[0].name;
            Row.qualifierValue = diagnosis.Qualifier[0].value;
            Row.qualifierCode = diagnosis.Qualifier[0].code;
            Row.qualifierPrefix = diagnosis.Qualifier[0].prefix;           

            if (diagnosis.Qualifier.Length == 2)
            {
                Row.lrName = diagnosis.Qualifier[1].name;
                Row.lrValue = diagnosis.Qualifier[1].value;
                Row.lrCode = diagnosis.Qualifier[1].code;
                Row.lrSuffix = diagnosis.Qualifier[1].prefix;
            }

            Row.jsonString = reviewConverted;

            Row.prefix = diagnosis.prefix;
            Row.suffix = diagnosis.suffix;

        }
    }
}
诊断等级:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SC_8aae662509ae4bab8491323924579173
{
    class Diagnosis
    {
        public string name { get; set; }
        public string code { get; set; }
        public string table { get; set; }
        public string addedby { get; set; }
        public string dateadded { get; set; }
        public qualifier[] Qualifier { get; set; }
        public string prefix { get; set; }
        public string suffix { get; set; }
        public string jsonString { get; set; }
    }
}

我曾尝试使用阵列和if函数来满足多个诊断,但都没有成功。有什么想法吗?非常感谢。

您说,您传递的是数组,而不是json中的对象。那个么你们为什么一直试图反序列化到诊断对象中呢? 您应该在此处将集合与类型诊断一起使用:

// Deserialize the string
var diagnosisCollection = js.Deserialize<ICollection<Diagnosis>>(reviewConverted);

您可以说,您传递的是数组,而不是json中的对象。那个么你们为什么一直试图反序列化到诊断对象中呢? 您应该在此处将集合与类型诊断一起使用:

// Deserialize the string
var diagnosisCollection = js.Deserialize<ICollection<Diagnosis>>(reviewConverted);

SSIS脚本可以是wierd环境。在这里避免使用第三方JSON解析器是正确的。但在某个地方,你的类型定义搞砸了

在将控制台应用程序集成到SSIS脚本组件/任务之前,我经常发现在控制台应用程序中编写、测试和排除代码故障非常有用。乙二醇

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp14
{
    class Program
    {
        class qualifier
        {
            public string name { get; set; }
            public string value { get; set; }
            public string code { get; set; }
            public string prefix { get; set; }
        }

        class Diagnosis
        {
            public string name { get; set; }
            public string code { get; set; }
            public string table { get; set; }
            public string addedby { get; set; }
            public string dateadded { get; set; }
            public qualifier[] Qualifier { get; set; }
            public string prefix { get; set; }
            public string suffix { get; set; }
            public string jsonString { get; set; }
        }
        static void Main(string[] args)
        {
            var json = @"
[
    {
        ""name"": ""Test 2"",
        ""code"": ""398057008"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""410605003"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    },
    {
        ""name"": ""Test 2"",
        ""code"": ""44255352"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""53252355"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    }
]
";
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();

            // Deserialize the string
            var diagnoses = js.Deserialize<Diagnosis[]>(json);

            Console.WriteLine("Complete");
            Console.ReadKey();


        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间控制台App14
{
班级计划
{
类限定符
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
公共字符串代码{get;set;}
公共字符串前缀{get;set;}
}
分类诊断
{
公共字符串名称{get;set;}
公共字符串代码{get;set;}
公共字符串表{get;set;}
由{get;set;}添加的公共字符串
公共字符串dateadded{get;set;}
公共限定符[]限定符{get;set;}
公共字符串前缀{get;set;}
公共字符串后缀{get;set;}
公共字符串jsonString{get;set;}
}
静态void Main(字符串[]参数)
{
var json=@”
[
{
“名称”:“测试2”,
“代码”:“398057008”,
“表”:“SNOMEDCT”,
“加上”:“morgan.baxter”,
“已添加日期”:1544523489235,
“限定词”:[
{
“名称”:“限定符”,
“值”:“已确认诊断”,
“代码”:“410605003”,
“前缀”:“[C]”
}
],
“前缀”:“[C]”
},
{
“名称”:“测试2”,
“代码”:“44255352”,
“表”:“SNOMEDCT”,
“加上”:“morgan.baxter”,
“已添加日期”:1544523489235,
“限定词”:[
{
“名称”:“限定符”,
“值”:“已确认诊断”,
“代码”:“53252355”,
“前缀”:“[C]”
}
],
“前缀”:“[C]”
}
]
";
System.Web.Script.Serialization.JavaScriptSerializer js=new System.Web.Script.Serialization.JavaScriptSerializer();
//反序列化字符串
var diagnosis=js.Deserialize(json);
控制台。写入线(“完整”);
Console.ReadKey();
}
}
}

SSIS脚本可以是wierd环境。在这里避免使用第三方JSON解析器是正确的。但在某个地方,你的类型定义搞砸了

在将控制台应用程序集成到SSIS脚本组件/任务之前,我经常发现在控制台应用程序中编写、测试和排除代码故障非常有用。乙二醇

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp14
{
    class Program
    {
        class qualifier
        {
            public string name { get; set; }
            public string value { get; set; }
            public string code { get; set; }
            public string prefix { get; set; }
        }

        class Diagnosis
        {
            public string name { get; set; }
            public string code { get; set; }
            public string table { get; set; }
            public string addedby { get; set; }
            public string dateadded { get; set; }
            public qualifier[] Qualifier { get; set; }
            public string prefix { get; set; }
            public string suffix { get; set; }
            public string jsonString { get; set; }
        }
        static void Main(string[] args)
        {
            var json = @"
[
    {
        ""name"": ""Test 2"",
        ""code"": ""398057008"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""410605003"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    },
    {
        ""name"": ""Test 2"",
        ""code"": ""44255352"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""53252355"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    }
]
";
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();

            // Deserialize the string
            var diagnoses = js.Deserialize<Diagnosis[]>(json);

            Console.WriteLine("Complete");
            Console.ReadKey();


        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间控制台App14
{
班级计划
{
类限定符
{
公共字符串名称{get;set;}
公共字符串值{get;set;}
公共字符串代码{get;set;}
公共字符串前缀{get;set;}
}
分类诊断
{
公共字符串名称{get;set;}
公共字符串代码{get;set;}
公共字符串表{get;set;}
由{get;set;}添加的公共字符串
公共字符串dateadded{get;set;}
公共限定符[]限定符{get;set;}
公共字符串前缀{get;set;}
公共字符串后缀{get;set;}
公共字符串jsonString{get;set;}
}
静态void Main(字符串[]参数)
{
var json=@”
[
{
“名称”:“测试2”,
“代码”:“398057008”,
“表”:“SNOMEDCT”,
“加上”:“morgan.baxter”,
“已添加日期”:1544523489235,
“限定词”:[
{
“名称”:“限定符”,
“值”:“已确认诊断”,
“代码”:“410605003”,
“前缀”:“[C]”
}
],
“前缀”:“[C]”
},
{
“名称”:“测试2”,
“代码”:“44255352”,
“表”:“SNOMEDCT”,
“加上”:“morgan.baxter”,
“已添加日期”:1544523489235,
“限定词”:[
{
“名称”:“限定符”,
“值”:“已确认诊断”,
“代码”:“53252355”,
“前缀”:“[C]”
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp14
{
    class Program
    {
        class qualifier
        {
            public string name { get; set; }
            public string value { get; set; }
            public string code { get; set; }
            public string prefix { get; set; }
        }

        class Diagnosis
        {
            public string name { get; set; }
            public string code { get; set; }
            public string table { get; set; }
            public string addedby { get; set; }
            public string dateadded { get; set; }
            public qualifier[] Qualifier { get; set; }
            public string prefix { get; set; }
            public string suffix { get; set; }
            public string jsonString { get; set; }
        }
        static void Main(string[] args)
        {
            var json = @"
[
    {
        ""name"": ""Test 2"",
        ""code"": ""398057008"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""410605003"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    },
    {
        ""name"": ""Test 2"",
        ""code"": ""44255352"",
        ""table"": ""SNOMEDCT"",
        ""addedby"": ""morgan.baxter"",
        ""dateadded"": 1544523489235,
        ""qualifier"": [
            {
                ""name"": ""Qualifier"",
                ""value"": ""Confirmed Diagnosis"",
                ""code"": ""53252355"",
                ""prefix"": ""[C] ""
            }
        ],
        ""prefix"": ""[C] ""
    }
]
";
            System.Web.Script.Serialization.JavaScriptSerializer js = new System.Web.Script.Serialization.JavaScriptSerializer();

            // Deserialize the string
            var diagnoses = js.Deserialize<Diagnosis[]>(json);

            Console.WriteLine("Complete");
            Console.ReadKey();


        }
    }
}