私は、このJSONスクリプトでいくつかの困難を持っている:逆シリアル化JSON配列は
{
"insured_agent_flag": "a",
"id": "1",
"agent": {
"fullName": "John Travolta",
"mobileNumberPdf": "+987654321",
"mobileNumber": "",
"identityCard": {
"identityCardExpirationDate": null
},
"secondIdentityCard": {
"identityCardExpirationDate": null
},
"notes": {},
"sign": "ADVANCED"
},
"basicData": {
"personType": "PERSON",
"agreeWithCompleteAnalysis": false,
"investmentInterest": false
},
"nonOfferedProducts": [
"PROD_A",
"PROD_B",
"PROD_C"
]
}
私はこのスクリプトからいくつかのパラメータを取得し、SQL Serverのテーブルに入れたいと思います。 はそれを行うためには、私が使用して変換https://mycontraption.comで共有するC#のスクリプト:「標準」の場合
using System;
using System.Data;
using System.Collections.Generic;
using System.Linq;
using Microsoft.SqlServer.Dts.Pipeline.Wrapper;
using Microsoft.SqlServer.Dts.Runtime.Wrapper;
using System.Web.Script.Serialization;
using Microsoft.SqlServer.Dts.Pipeline;
namespace SC_c7e2d8c3918d46a5a07a1b438ddc7642
{
public class BasicData
{
public string agreeWithCompleteAnalysis { get; set; }
public string inOtherSystem { get; set; }
public string investmentInterest { get; set; }
}
public class ParentObject
{
public BasicData BasicData { get; set; }
public int id { get; set; }
public string insured_agent_flag { get; set; }
public IEnumerable<string> NonOfferedProducts { get; set; }
}
[Microsoft.SqlServer.Dts.Pipeline.SSISScriptComponentEntryPointAttribute]
public class ScriptMain : UserComponent
{
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.parameterscon;
// Convert from blob to string
string reviewConverted = System.Text.Encoding.ASCII.GetString(combinedColumn.GetBlobData(0, Convert.ToInt32(combinedColumn.Length)));
// Deserialize the string
ParentObject obj = js.Deserialize<ParentObject>(reviewConverted);
var rows = obj.NonOfferedProducts.ToList();
Row.agreeWithCompleteAnalysis = obj.BasicData.agreeWithCompleteAnalysis;
Row.inOtherSystem = obj.BasicData.inOtherSystem;
Row.investmentInterest = obj.BasicData.investmentInterest;
Row.projectionid = obj.id;
Row.insuredagentflag = obj.insured_agent_flag;
//Row.nonOfferedProducts =
}
}
}
それが正常に動作オブジェクトを、しかし、配列「nonOfferedProducts」に問題があります。コンパイル後、私はエラーを受け取ります: "オブジェクト参照がオブジェクトのインスタンスに設定されていません"。
ここに私の質問があります: 1. C#スクリプトで 'nonOfferedProducts'配列をどのように扱うべきですか? 2.前述のエラーが発生するのはなぜですか? 3.残念ながら、jsonスクリプトには中カッコのようなエラーがある可能性があります。私はそれをどのように扱うべきですか?
ありがとうございました!
お返事ありがとうございます。あなたのコメントによると、私はあなたにもっと説明を与えようとします: 1.この記事で追加したjsonスクリプト - スクリプト全体のほんの一部です。完全なスクリプトには、さまざまなパラメータがあります。さらに、私のC#コードは約40.000個のjsonスクリプト(SQL Serverのテーブルに1列で格納されています)をスキャンする必要があります。これらのスクリプトは類似の構造を持っていますが、同じではありません。 私はC#の解像度について考え、必要なパラメータを探します。これらのパラメータを持たないjsonスクリプトの場合、C#コードは正しい出力列にヌルを入れます。ここで
が私の出力列です: -agreeWithCompleteAnalysis -inOtherSystem -investmentInterest -projectionId -insuredAgentFflag -nonOfferedProducts
私は理解し、私のクラスの構造が間違っていた - 私はそれを改善します。 しかし、私は1つの疑問を持っています - 必要なこれらのパラメータだけを処理するC#コード構造を準備することは可能ですか?
最後に、結果をデータベースに保存したいと思います。 たとえば、nonOfferedProductsプロパティに3つの値(必ずしも!)がない場合、私のデータベーステーブルに3レコード(nonOfferedProductsカラムの3つの異なる値と残りのカラムの同じ値-agreeWithCompleteAnalysis、inOtherSystemなど) 。
今はっきりすることを願っています。 ご協力いただきありがとうございます!
J
ループを実行すると予想されるアルゴリズムの英語の説明であるコメントを追加するコードを編集してください。論理的な意味がなく、あなたの意図が書かれたものから推測できない場合 –
C#クラスがJSONモデルと一致しません - 'basicData'はメインオブジェクト内の' object'です。 'agreeWithCompleteAnalysis'はこのオブジェクトのプロパティです。 'nonOfferedProducts'は、親オブジェクトの配列プロパティです。デシリアライズがこれをどのように処理しているのかよく分かりませんが、 'nonOfferedProducts'プロパティを持たない' basicData'オブジェクトだけを取り出していると仮定します。したがって、nullです。しかし、基本的な答えは単に 'nonOfferedProducts'が参照される前にヌルであるかどうかを確認することです - しかし、あなたの問題は本当にJSONとクラスの間の不一致だと思います。 – GPW
JSONが不正な形式の場合、それを拒否したり、適切なビットがあるかどうかにかかわらず、自分のパーサを最初から書き出して、必要な値を引き出す必要があります。個人的には、一貫性のある有効なデータを主張するか、問題を求めていると思います。 JSONは定義によるとJSONではなく、見た目だけのテキストです。 – GPW