C#SSIS中的JSON序列化 已解决:我不再将字符串视为数组,而是将换行分隔符添加到连接管理器中,以便将每一行视为新行。这解决了这个问题,消除了通过C#脚本处理这个问题的需要。
我构建了一个SSIS包,它使用一个C#脚本任务来反序列化JSON字符串并将其插入表中 我使用了一个JSON原型字符串: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","
{"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();
}
}
}