C#は、カスタムコンストラクターを使用して1つのjsonフィールドをオブジェクトに解析します

dingorth

次のようなJSON文字列があると仮定します。

{
 "a" : "1",
 "b" : "string",
 "c" : ["1994-11-05T08:15:30-05:00 Text1. Text2.",
        "1993-12-03T08:15:30-05:00 Text1b. Text2b."]
}

私はそれを次のように解析したいと思います:

class A
{
  int a;
  string b;
  List<CustomObjects> c;
}

class CustomObject
{
  DateTime date;
  string text1;
  string text2;
  void CustomObject(string constructString)
  {
    // parsing constructString into object fields
  }
}

JSON.NETのようなC#JSONパーサーを使用してCustomObjectコンストラクターを提供して希望どおりに解析する方法はありますか?私は自分のパーサーを書かないようにしているだけです。多分それは必要ではありません。

ブライアンロジャース

これは、JSONを変更せずに、小さなカスタムJsonConverter使用してコンストラクターの呼び出し方法を指示するJson.Netで実行できます。

class ConstructFromStringConverter : JsonConverter
{
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
    {
        ConstructorInfo ctor = objectType.GetConstructor(new Type[] { typeof(string) });
        if (ctor != null)
        {
            return ctor.Invoke(new object[] { (string)reader.Value });
        }
        throw new JsonException(objectType.Name + " does not have a public constructor that accepts a string.");
    }

    public override bool CanWrite
    {
        get { return false; }
    }

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override bool CanConvert(Type objectType)
    {
        return false;
    }
}

CustomObjectクラスでコンバーターを使用するには、次のようにコンバーターに[JsonConverter]属性を設定する必要があります

[JsonConverter(typeof(ConstructFromStringConverter))]
class CustomObject
{
    ...
}

次に、通常の方法でJSONを逆シリアル化すると、「正常に機能」します。

A a = JsonConvert.DeserializeObject<A>(json);

これが実際のデモです:https//dotnetfiddle.net/md2hH6

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

C#カスタムクラスを使用してWebユーザーコントロールを作成しようとしていますが、オブジェクトがオブジェクトエラーのインスタンスに設定されていません

分類Dev

C#でインラインXAMLを使用して、コードビハインドでカスタムオブジェクトを簡単に作成する方法

分類Dev

カスタムコンストラクターを使用してオブジェクトをクラス属性としてインスタンス化する(C ++)

分類Dev

mapstructを使用して2つのソースオブジェクトをターゲットオブジェクトにマージする必要があります。ここで、source1の1つのフィールドにはListがあり、source2の1つのフィールドは文字列です。

分類Dev

C ++:コンストラクター内で1つのオブジェクトを別のオブジェクトにコピーします

分類Dev

apexコントローラーからのルックアップフィールドを使用してカスタムオブジェクトにデータを挿入する方法

分類Dev

Pythonのカスタムフィールドを使用してオブジェクトをjsonにシリアル化する方法

分類Dev

2つのオブジェクトに一致するフィルタリングされたストリームは、1つのオブジェクトの値を別のオブジェクトの値に設定します

分類Dev

ジャクソン:カスタムフィールドJsonDeserializerでオブジェクト全体を取得します

分類Dev

Javaは、クラスのフィールドとして2つの異なるオブジェクトタイプを使用します

分類Dev

Rubyを使用して、ネストされたJSONオブジェクトをフィルタリングし、特定のキーを持つJSONを取得します

分類Dev

カスタムクラスに準拠するメンバーを持つオブジェクトの値を設定する場合、クラスはキーのキー値コーディングに準拠していません

分類Dev

MockServerを使用してバイト配列フィールドを持つカスタムオブジェクトを返す方法は?

分類Dev

Dozerのカスタムコンバーターを使用して、オブジェクトのリストを別のリストにマップします

分類Dev

カスタムメソッドを使用してフィールドをネストされたオブジェクトにマッピングする

分類Dev

コンストラクターのパラメーターの1つを使用してオブジェクトを作成します

分類Dev

Javaの8つのストリームを使用してフィルタし、変更するには、リストオブジェクト

分類Dev

エンティティフレームワークを使用してデータベースにBLOBとしてjsonオブジェクトを追加します

分類Dev

APIは、すべてのレコードを取得するときにオブジェクトの配列を返しますが、フィルタリングするときは1つのオブジェクトのみを返します

分類Dev

オブジェクトデータフィールドをサブクラスインスタンスにコピーします

分類Dev

1つのKubernetes入力オブジェクトを使用してトラフィックを異なるクラスター内のk8sサービスにルーティングすることは可能ですか?

分類Dev

Javaストリームフィルターを使用して、別のリストの一部ではない1つのリスト内のオブジェクトのリストをフェッチします

分類Dev

Javaストリームを使用してオブジェクトをフィルタリングする方法は?

分類Dev

Parcebaleを使用してフラグメント間でバンドルを介してカスタムクラスオブジェクトを送信します

分類Dev

DataContractJsonSerializerを使用して、JSON文字列をプロパティとしてリストとインターフェイスを持つC#オブジェクトに逆シリアル化します

分類Dev

GSON解析の前にカスタムフィールドをオブジェクトに追加する方法

分類Dev

Javaの8ストリームを使用して2つのアレイ複合オブジェクト要素をフィルタリングします

分類Dev

キーに基づいてJSONをフィルタリングするにはどうすればよいですか?すべてのオブジェクトに対して1つのタイプのキーのリストしかありません

分類Dev

Android:Parcerableを使用して、カスタムオブジェクトのArrayListをフラグメントからアクティビティに送信します

Related 関連記事

  1. 1

    C#カスタムクラスを使用してWebユーザーコントロールを作成しようとしていますが、オブジェクトがオブジェクトエラーのインスタンスに設定されていません

  2. 2

    C#でインラインXAMLを使用して、コードビハインドでカスタムオブジェクトを簡単に作成する方法

  3. 3

    カスタムコンストラクターを使用してオブジェクトをクラス属性としてインスタンス化する(C ++)

  4. 4

    mapstructを使用して2つのソースオブジェクトをターゲットオブジェクトにマージする必要があります。ここで、source1の1つのフィールドにはListがあり、source2の1つのフィールドは文字列です。

  5. 5

    C ++:コンストラクター内で1つのオブジェクトを別のオブジェクトにコピーします

  6. 6

    apexコントローラーからのルックアップフィールドを使用してカスタムオブジェクトにデータを挿入する方法

  7. 7

    Pythonのカスタムフィールドを使用してオブジェクトをjsonにシリアル化する方法

  8. 8

    2つのオブジェクトに一致するフィルタリングされたストリームは、1つのオブジェクトの値を別のオブジェクトの値に設定します

  9. 9

    ジャクソン:カスタムフィールドJsonDeserializerでオブジェクト全体を取得します

  10. 10

    Javaは、クラスのフィールドとして2つの異なるオブジェクトタイプを使用します

  11. 11

    Rubyを使用して、ネストされたJSONオブジェクトをフィルタリングし、特定のキーを持つJSONを取得します

  12. 12

    カスタムクラスに準拠するメンバーを持つオブジェクトの値を設定する場合、クラスはキーのキー値コーディングに準拠していません

  13. 13

    MockServerを使用してバイト配列フィールドを持つカスタムオブジェクトを返す方法は?

  14. 14

    Dozerのカスタムコンバーターを使用して、オブジェクトのリストを別のリストにマップします

  15. 15

    カスタムメソッドを使用してフィールドをネストされたオブジェクトにマッピングする

  16. 16

    コンストラクターのパラメーターの1つを使用してオブジェクトを作成します

  17. 17

    Javaの8つのストリームを使用してフィルタし、変更するには、リストオブジェクト

  18. 18

    エンティティフレームワークを使用してデータベースにBLOBとしてjsonオブジェクトを追加します

  19. 19

    APIは、すべてのレコードを取得するときにオブジェクトの配列を返しますが、フィルタリングするときは1つのオブジェクトのみを返します

  20. 20

    オブジェクトデータフィールドをサブクラスインスタンスにコピーします

  21. 21

    1つのKubernetes入力オブジェクトを使用してトラフィックを異なるクラスター内のk8sサービスにルーティングすることは可能ですか?

  22. 22

    Javaストリームフィルターを使用して、別のリストの一部ではない1つのリスト内のオブジェクトのリストをフェッチします

  23. 23

    Javaストリームを使用してオブジェクトをフィルタリングする方法は?

  24. 24

    Parcebaleを使用してフラグメント間でバンドルを介してカスタムクラスオブジェクトを送信します

  25. 25

    DataContractJsonSerializerを使用して、JSON文字列をプロパティとしてリストとインターフェイスを持つC#オブジェクトに逆シリアル化します

  26. 26

    GSON解析の前にカスタムフィールドをオブジェクトに追加する方法

  27. 27

    Javaの8ストリームを使用して2つのアレイ複合オブジェクト要素をフィルタリングします

  28. 28

    キーに基づいてJSONをフィルタリングするにはどうすればよいですか?すべてのオブジェクトに対して1つのタイプのキーのリストしかありません

  29. 29

    Android:Parcerableを使用して、カスタムオブジェクトのArrayListをフラグメントからアクティビティに送信します

ホットタグ

アーカイブ