2017-03-16 10 views
-1

NewtonSoft JSONを使用してこのタイプのオブジェクトにデシリアライズする方法は?構造体にはプロパティ型変数が含まれていますが、この構造体に基づいてNewtonSoftを使用すると、このプロパティは別のクラスになります。NewtonSoft Jsonを使用して、変数型プロパティを持つクラスにデシリアライズする方法はありますか?

次のコード例:PACKAGE_ID、以下の構造、フィールド「PACKAGE_ID」のように受信され、このクエリのリターンを送信することが必要であり、このパッケージのデータクエリで

public class RootProduct 
{ 
    public Package Package {get; set;} 
} 

public class Package 
{ 
    //Package has a property in which the class type should be changed in order to deserialize 
    public Package_id ThisValueIsVariable {get; set;} 
} 

public class Package_id 
{ 
    public string product_name {get; set;} 
} 

( JSON)は、このコードをクエリで送信します。

戻りJSON:

"Package": { 
    "Package_id": { //This is the value that changes according to the value passed in the query to JSON 
     "package_name": "my product name" 
    } 
} 

"Package": { 
    "SecondPackage_id": { //This is the value that changes according to the value passed in the query to JSON 
     "package_name": "my product name" 
    } 
} 

"Package": { 
     "ThirdPackage_id": { //This is the value that changes according to the value passed in the query to JSON 
      "package_name": "my product name" 
     } 
} 

UPDATE:

「PACKAGE_ID」名前を持つ唯一のクラスがあるので、最初の生成物は、逆シリアル化される上記のコードで

、及び第二SecondPackage_idクラスが連続して存在しないため、3番目のJSONアイテムはJsonConvert.Deserializeを使用して逆シリアル化されません。

+0

から(複数の)名前付きオブジェクトを取得するには、辞書を使用し – Waaghals

+0

@Waaghalsこのメッセージの意味を「パッケージは、クラスタイプが変更されるべき性質を持っています」返されるJSONのフィールド "package_id"は固定名ではない、つまりフィールドタイプは固定フィールドではなくすべてのバリエーションに同じプロパティが含まれていることを確認してください。その名前はパッケージIDです。JSONタグはパッケージのIDです。リストを照会する場合は別の「名前」が付いていますが、同じクラスです。私はこのダイナミックなことができるようにする方法を見つける必要があるので、Newtonsoftは非直列化するものを理解しています。 –

答えて

1

解決方法は、実行時の前に名前が分かっているかどうかによって異なります。

あなたは次のように使用すると、パッケージのクラスで種類ごとに別々のプロパティを作成することができ、手の前に可能な名前を知っている:

public class Package 
{ 
    public Package_id FirstPackage {get; set;} 
    public Package_id SecondPackage {get; set;} 
    public Package_id ThridPackage {get; set;} 
} 

その他のプロパティはnullに再シリアライズする必要があります。

実行時にIDがわからない場合は、実際には のキー値のペアが受信されています。それらのキーはオブジェクトごとに異なるため、技術的には複数の場合があります(場合によっては常に1つだけでもよい)。あなたはあなたが何を意味するかを示すために、あなたのコード例を変更することができますJSON

public class RootProduct 
{ 
    //No package class needed 
    public IDictionary<string, Package_id> Package {get; set;} 
} 

public class Package_id 
{ 
    public string product_name {get; set;} 
} 
+0

期待値が何であるか分かりません...ランダム化されています –

+0

完了!ありがとう! –

関連する問題