JSON文字列をC#オブジェクトに変換


183

JSON文字列をC#のオブジェクトに変換しようとしています。本当に簡単なテストケースを使用する:

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

問題は、routes_listが設定されないことです。未定義のオブジェクトです。何か案は?


1
@Greg:JavaScriptSerializerWCFのカスタムJSON形式以外は受け入れないため、実際にはMSを超えるバージョンをお勧めします(たとえば、日付のように見えるがDATE()で囲まれていない日付フィールドは無残に失敗します)
Brad Christie

また、この.NETの記事で、JavascriptSerializerを使用したJSONオブジェクトの解析に関する記事もご覧ください。これは実際には素晴らしいチュートリアルです。
scatmoi

JavaScriptSerializerはどこで入手できますか?C#.NET 3.5プロジェクトでは認識されません。
B.クレイシャノン

1
@B。クレイシャノンこれは私のためにそれを解決しstackoverflow.com/questions/7000811/...
FUZZYBEAR

回答:


127

生のオブジェクトに逆シリアル化しようとしているようです。変換先のオブジェクトを表すクラスを作成できます。これは、より大きなオブジェクトやJSON文字列を扱う場合に最も役立ちます。

例えば:

  class Test {

      String test; 

      String getTest() { return test; }
      void setTest(String test) { this.test = test; }

  }

次に、逆シリアル化コードは次のようになります。

   JavaScriptSerializer json_serializer = new JavaScriptSerializer();
   Test routes_list = 
          (Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

詳細については、このチュートリアルをご覧くださいhttp : //www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx


1
しかし、先のとがった記事では自動プロパティが使用されます。それも言及する価値があります。
Ivan Kochurkin 2012

11
申し訳ありませんが、このコードサンプルは機能しません。DeserializeObjectは例外を出します。var routes_list = serializer.Deserialize <Test>( "{\" test \ ":\" some data \ "}");を使用します。代わりに。また、get / setTest()は不要であり、文字列テストは公開する必要があります。これはC#よりもjavaに似ています。
dvallejo 2013年

Dan Vallejoが述べたように、これは誤ったソリューションです。結局のところ、setTest(String test)は返されません。これもコンパイルエラーです。
Payam 2014

1
これも使用できます:json_serializer.Deserialize <Test>( "{\" test \ ":\" some data \ "}"); //(Test)json_serializer .....の代わりに
Bashar Abu Shamaa

1
クラスオブジェクトの形式がわからない場合は、このリンクを試してください。Json文字列を適切なクラスに変換します。時間を大幅に節約できました。
jade290

231

または、次のようにNewtownsoft.Jsonライブラリを使用できます。

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

TJSON文字列と一致するオブジェクトタイプはどこにありますか。


3
それはとても簡単で、私はこれを行う方法について長い間考えました。
maracuja-juice 2017

58

おそらく、routes_listをobjectタイプとして宣言したくないだけでしょう。これには.testプロパティがないため、実際に素晴らしいオブジェクトを取得することはできません。これは、クラスや構造体を定義したり、動的キーワードを利用したりした方がよい場所の1つです。

このコードを実際に機能させたい場合は、DeserializeObjectによって返されるオブジェクトがstring、objectの汎用辞書であることを知っておく必要があります。これをそのようにするコードは次のとおりです。

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

dynamicキーワードを使用する場合は、こちらの方法を参照してください

クラスまたは構造体を宣言する場合は、次のようにDeserializeObjectの代わりにDeserializeを呼び出すことができます。

class MyProgram {
    struct MyObj {
        public string test { get; set; }
    }

    static void Main(string[] args) {
        var json_serializer = new JavaScriptSerializer();
        MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
        Console.WriteLine(routes_list.test);

        Console.WriteLine("Done...");
        Console.ReadKey(true);
    }
}

実行:json_serializer = new JavaScriptSerializer(); オブジェクトroutes_list =(IDictionary <string、object>)json_serializer.DeserializeObject( "{\" test \ ":\"ここにいくつかのデータ\ "}"); それでも「routes_list」を取得することは、現在のコンテキストには存在しません。
ジャスティン

1
使用しないでくださいobject routes_listvar自分で使用するか明示的に繰り返して、routes_listをIDictionary <string、object>として宣言します。
mattmc3

31

JavaScriptSerializerで動的オブジェクトを使用する。

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"

19

Newtonsoftは、javaスクリプトシリアライザーよりも高速です。...これは、人気がありデフォルトのシリアライザよりも優れているNewtonsoft NuGetパッケージに依存しています。

1行のコードソリューション。

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);

15

ここで私は様々な記事から一緒に石畳の単純なクラスは、それが約15分間テストされています....だが、思わ私の目的のために仕事に。これは、この投稿でJavascriptSerializer詳しく説明さている情報を使用してアプリで参照できる作業を行うために使用します。

以下のコードをLinqPadで実行して、次の方法でテストできます。

  • LinqPadのスクリプトタブを右クリックし、[クエリプロパティ]を選択します。
  • 「その他の参考資料」の「System.Web.Extensions.dll」の参照
  • 「System.Web.Script.Serialization」の「Additional Namespace Imports」を追加します。

それが役に立てば幸い!

void Main()
{
  string json = @"
  {
    'glossary': 
    {
      'title': 'example glossary',
        'GlossDiv': 
        {
          'title': 'S',
          'GlossList': 
          {
            'GlossEntry': 
            {
              'ID': 'SGML',
              'ItemNumber': 2,          
              'SortAs': 'SGML',
              'GlossTerm': 'Standard Generalized Markup Language',
              'Acronym': 'SGML',
              'Abbrev': 'ISO 8879:1986',
              'GlossDef': 
              {
                'para': 'A meta-markup language, used to create markup languages such as DocBook.',
                'GlossSeeAlso': ['GML', 'XML']
              },
              'GlossSee': 'markup'
            }
          }
        }
    }
  }

  ";

  var d = new JsonDeserializer(json);
  d.GetString("glossary.title").Dump();
  d.GetString("glossary.GlossDiv.title").Dump();  
  d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();  
  d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();    
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();   
  d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump(); 
  d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();   
}


// Define other methods and classes here

public class JsonDeserializer
{
  private IDictionary<string, object> jsonData { get; set; }

  public JsonDeserializer(string json)
  {
    var json_serializer = new JavaScriptSerializer();

    jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
  }

  public string GetString(string path)
  {
    return (string) GetObject(path);
  }

  public int? GetInt(string path)
  {
    int? result = null;

    object o = GetObject(path);
    if (o == null)
    {
      return result;
    }

    if (o is string)
    {
      result = Int32.Parse((string)o);
    }
    else
    {
      result = (Int32) o;
    }

    return result;
  }

  public object GetObject(string path)
  {
    object result = null;

    var curr = jsonData;
    var paths = path.Split('.');
    var pathCount = paths.Count();

    try
    {
      for (int i = 0; i < pathCount; i++)
      {
        var key = paths[i];
        if (i == (pathCount - 1))
        {
          result = curr[key];
        }
        else
        {
          curr = (IDictionary<string, object>)curr[key];
        }
      }
    }
    catch
    {
      // Probably means an invalid path (ie object doesn't exist)
    }

    return result;
  }
}

14

Newtonsoft.Jsonライブラリを使用すると、要件を簡単に達成できます。以下の1つの例を見てみましょう。

受け取るオブジェクトのタイプのクラス:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }

}

コード:

static void Main(string[] args)
{

      string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";

      User user = JsonConvert.DeserializeObject<User>(json);

      Console.ReadKey();
}

これは、jsonを解析する非常に簡単な方法です。


11

tripletdad99が言ったように

var result = JsonConvert.DeserializeObject<T>(json);

ただし、追加のオブジェクトを作成したくない場合は、Dictionary代わりに

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);

これは、あなたがUrl.Action(アクション、コントローラ、結果)にパラメータを渡すwheh、便利です
Lapenkovウラジミール

8

このddlをプロジェクトへの参照に追加します:System.Web.Extensions.dll

この名前空間を使用します。System.Web.Script.Serializationを使用します

public class IdName
{
    public int Id { get; set; }
    public string Name { get; set; }
}


   string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
   var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);

   string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
   var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);

6

あなたのJSONをコピーし、上のテキストボックスに貼り付けるjson2csharpと生成]ボタンをクリックしてください。

CSのクラスは、以下のように使用することをCSファイルを生成します

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

どこでRootObject発生したの名前であるCSのファイルは、


4

これらの手順を半自動化する別の高速で簡単な方法は、次のとおりです。

  1. 解析するJSONを取得して、https//app.quicktype.io/に貼り付けます。ドロップダウンで言語をC#に変更します。
  2. 左上の名前をクラス名に更新します。デフォルトは「ようこそ」です。
  3. Visual Studioで、[Webサイト]-> [パッケージの管理]に移動し、NuGetを使用してNewtonsoftからJson.Netを追加します。
  4. app.quicktype.ioは、Newtonsoftに基づいてシリアル化メソッドを生成しました。または、次のようなコードを使用できます。

    WebClient client = new WebClient();

    string myJSON = client.DownloadString( " https://URL_FOR_JSON.com/JSON_STUFF ");

    var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);


リンクが無効になりました
Myles J

Myles Jに感謝します。正常に動作しているように見える新しいサイトに更新しました。
ジェイソンヒッチング

0

JSON文字列をC#のオブジェクトに変換します。以下のテストケースを使用します。ここで「MenuInfo」は私のC#クラスオブジェクトです。

JsonTextReader reader = null;
try
{
    WebClient webClient = new WebClient();
    JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
    reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
    reader.SupportMultipleContent = true;
}
catch(Exception)
{}

JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);

0

まず、次のようなライブラリを含める必要があります。

using System.Runtime.Serialization.Json;

DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";

using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
    BlogSite b = (BlogSite)desc.ReadObject(ms);
    Console.WriteLine(b.Name);
    Console.WriteLine(b.Description);
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.