JObjectを.NETオブジェクトに逆シリアル化する方法


241

Newtonsoft JSONライブラリを楽しく利用しています。たとえばJObject、.NETオブジェクトからを作成します。この場合は、Exceptionのインスタンスです(サブクラスの場合とそうでない場合があります)。

if (result is Exception)
    var jobjectInstance = JObject.FromObject(result);

これで、ライブラリがJSONテキスト(つまり文字列)をオブジェクトに逆シリアル化できることがわかりました

// only works for text (string)
Exception exception = JsonConvert.DeserializeObject<Exception>(jsontext); 

しかし私が探しているのは:

// now i do already have an JObject instance
Exception exception = jobjectInstance.????

さてJObject、JSONテキストに戻ってから逆シリアル化機能を使用できることは明らかですが、それは私には逆に思えます。

回答:


489

この投稿によると、それは今でははるかに優れています:

// pick out one album
JObject jalbum = albums[0] as JObject;

// Copy to a static Album instance
Album album = jalbum.ToObject<Album>();

ドキュメント:JSONを型に変換する


10
ここでのパフォーマンスへの影響に関するアイデアはありますか?リフレクションは毎回使用されますか?
Shaun Rowan 2013年

1
カスタムJsonConverterでこれを行うことは可能ですか?
Justin Skiles、2015

3
ヒントありがとうございます。それは私を大いに助けました。何かを追加してみましょう:typeを使用しているジェネリックメソッドでは、それを正常に変換するTようなものが必要でしresult=(value is JObject) ? ((JObject)value).ToObject<T>() : (T)default(T);た(注- valueデータベースからのオブジェクトであり、JObjectなどの場合、結果はnullになります)。
マット

@ShaunRowan Linqpadのコードをいじってみると、リフレクションを使用して、JSONオブジェクトの対応するフィールドと同じターゲットオブジェクトの「レベル」でプロパティを照合するように見えます。プロパティの名前はJSONフィールドの名前と一致する必要があり、プロパティのタイプは互換性のあるタイプである必要があります。
BobbyA 2017

jobject.ToObject(myObject.GetType())オブジェクトの種類がわからない場合に使用します。
Tohid

45

ドキュメントから私はこれを見つけました

JObject o = new JObject(
   new JProperty("Name", "John Smith"),
   new JProperty("BirthDate", new DateTime(1983, 3, 20))
);

JsonSerializer serializer = new JsonSerializer();
Person p = (Person)serializer.Deserialize(new JTokenReader(o), typeof(Person));

Console.WriteLine(p.Name);

のクラス定義はPerson、以下と互換性がある必要があります。

class Person {
    public string Name { get; internal set; }
    public DateTime BirthDate { get; internal set; }
}

編集する

あなたがJSON.netの最新バージョンを使用している場合、カスタムのシリアル化を必要としない、上記TienDoの回答を参照してください(またはあなたが私upvote場合は、以下:P)を、より簡潔です。


2
カスタムシリアライゼーション設定を渡すことができるようにするには、省略形ではなく、このアプローチを使用する必要がありました。
ジャスティンカルディコット2015

検索中の正確なans
Mark-VII

2

遅すぎる、誰かが別の方法を探している場合に備えて:

void Main()
{
    string jsonString = @"{
  'Stores': [
    'Lambton Quay',
    'Willis Street'
  ],
  'Manufacturers': [
    {
      'Name': 'Acme Co',
      'Products': [
        {
          'Name': 'Anvil',
          'Price': 50
        }
      ]
    },
    {
      'Name': 'Contoso',
      'Products': [
        {
          'Name': 'Elbow Grease',
          'Price': 99.95
        },
        {
          'Name': 'Headlight Fluid',
          'Price': 4
        }
      ]
    }
  ]
}";

    Product product = new Product();
    //Serializing to Object
    Product obj = JObject.Parse(jsonString).SelectToken("$.Manufacturers[?(@.Name == 'Acme Co' && @.Name != 'Contoso')]").ToObject<Product>();

    Console.WriteLine(obj);
}


public class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

これは、受け入れられた回答とまったく同じように見えます
jpaugh
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.