JSONをC#動的オブジェクトに逆シリアル化しますか?


965

JSONコンテンツをC#4動的型に逆シリアル化する方法はありますか?を使用するために、一連のクラスの作成をスキップすると便利ですDataContractJsonSerializer


5
何か「動的」が必要な場合は、plain-old-objectに行かないほとんどのJSONデコーダーに付属するgetスタイルのアクセサーを使用しないのはなぜですか?(たとえば、「動的な」オブジェクト作成の必要性は本当にあるのですか?)json.orgには、C#JSON実装へのリンクがたくさんあります。

外部の依存関係を最小限に抑えようとしているプロジェクトに取り組んでいます。したがって、ストック.netシリアライザーとタイプを使用して何かが可能であれば、それが優先されます。もちろん、それが不可能な場合は、json.orgにアクセスします。ありがとう!
jswanson

42
C#チームが「動的」を追加したことに本当に驚いていますが、CLRにはJSONオブジェクトを動的CLRクラスインスタンスに変換する方法がありません。
フランクSchwieterman

2
残念ながら、受け入れられた回答は.NET 4 RTMでは機能しません。私は、他の人に役立つかもしれない、これをうまく進めるのに役立つ回答を投稿しました。
Drew Noakes、2009

(ただし、Newtonsoft JSON.NETはかなり近づいているようですが、実際に良い例はありません。)
Hot Licks

回答:


659

System.Web.Helpersアセンブリへの依存関係に満足している場合は、Jsonクラスを使用できます。

dynamic data = Json.Decode(json);

MVCフレームワークには、.NET 4フレームワークへの追加ダウンロードとして含まれています。それが役に立った場合は、必ずVladに賛成票を投じてください。ただし、クライアント環境にこのDLLが含まれていると想定できない場合は、次に進んでください。


ここでは、別の逆シリアル化アプローチを提案しています。バグを修正し、コーディングスタイルに合うようにコードを少し変更しました。必要なのは、このコードとSystem.Web.Extensionsプロジェクトからの参照だけです。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Web.Script.Serialization;

public sealed class DynamicJsonConverter : JavaScriptConverter
{
    public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
    {
        if (dictionary == null)
            throw new ArgumentNullException("dictionary");

        return type == typeof(object) ? new DynamicJsonObject(dictionary) : null;
    }

    public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
    {
        throw new NotImplementedException();
    }

    public override IEnumerable<Type> SupportedTypes
    {
        get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }
    }

    #region Nested type: DynamicJsonObject

    private sealed class DynamicJsonObject : DynamicObject
    {
        private readonly IDictionary<string, object> _dictionary;

        public DynamicJsonObject(IDictionary<string, object> dictionary)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");
            _dictionary = dictionary;
        }

        public override string ToString()
        {
            var sb = new StringBuilder("{");
            ToString(sb);
            return sb.ToString();
        }

        private void ToString(StringBuilder sb)
        {
            var firstInDictionary = true;
            foreach (var pair in _dictionary)
            {
                if (!firstInDictionary)
                    sb.Append(",");
                firstInDictionary = false;
                var value = pair.Value;
                var name = pair.Key;
                if (value is string)
                {
                    sb.AppendFormat("{0}:\"{1}\"", name, value);
                }
                else if (value is IDictionary<string, object>)
                {
                    new DynamicJsonObject((IDictionary<string, object>)value).ToString(sb);
                }
                else if (value is ArrayList)
                {
                    sb.Append(name + ":[");
                    var firstInArray = true;
                    foreach (var arrayValue in (ArrayList)value)
                    {
                        if (!firstInArray)
                            sb.Append(",");
                        firstInArray = false;
                        if (arrayValue is IDictionary<string, object>)
                            new DynamicJsonObject((IDictionary<string, object>)arrayValue).ToString(sb);
                        else if (arrayValue is string)
                            sb.AppendFormat("\"{0}\"", arrayValue);
                        else
                            sb.AppendFormat("{0}", arrayValue);

                    }
                    sb.Append("]");
                }
                else
                {
                    sb.AppendFormat("{0}:{1}", name, value);
                }
            }
            sb.Append("}");
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            if (!_dictionary.TryGetValue(binder.Name, out result))
            {
                // return null to avoid exception.  caller can check for null this way...
                result = null;
                return true;
            }

            result = WrapResultObject(result);
            return true;
        }

        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            if (indexes.Length == 1 && indexes[0] != null)
            {
                if (!_dictionary.TryGetValue(indexes[0].ToString(), out result))
                {
                    // return null to avoid exception.  caller can check for null this way...
                    result = null;
                    return true;
                }

                result = WrapResultObject(result);
                return true;
            }

            return base.TryGetIndex(binder, indexes, out result);
        }

        private static object WrapResultObject(object result)
        {
            var dictionary = result as IDictionary<string, object>;
            if (dictionary != null)
                return new DynamicJsonObject(dictionary);

            var arrayList = result as ArrayList;
            if (arrayList != null && arrayList.Count > 0)
            {
                return arrayList[0] is IDictionary<string, object> 
                    ? new List<object>(arrayList.Cast<IDictionary<string, object>>().Select(x => new DynamicJsonObject(x))) 
                    : new List<object>(arrayList.Cast<object>());
            }

            return result;
        }
    }

    #endregion
}

次のように使用できます。

string json = ...;

var serializer = new JavaScriptSerializer();
serializer.RegisterConverters(new[] { new DynamicJsonConverter() });

dynamic obj = serializer.Deserialize(json, typeof(object));

したがって、JSON文字列が与えられます:

{
  "Items":[
    { "Name":"Apple", "Price":12.3 },
    { "Name":"Grape", "Price":3.21 }
  ],
  "Date":"21/11/2010"
}

次のコードは実行時に機能します。

dynamic data = serializer.Deserialize(json, typeof(object));

data.Date; // "21/11/2010"
data.Items.Count; // 2
data.Items[0].Name; // "Apple"
data.Items[0].Price; // 12.3 (as a decimal)
data.Items[1].Name; // "Grape"
data.Items[1].Price; // 3.21 (as a decimal)

1
動的obj = serializer.Deserialize(json、typeof(object));でエラーが発生します。2つの引数を持つメソッドのオーバーロードがないと言っています..間違ったdllまたは何?
Stewie Griffin 2011

32
System.Web.Helpers.Jsonを使用できます-動的オブジェクトを返すDecodeメソッドを提供します。この情報も回答として投稿しました。
Vlad Iliescu、2012

2
これは私にも多くの助けになりましたが、.Serializeメソッドを使用する必要がある場合はどうすればよいのか知りたいです。クラス。誰かが私を正しい方向に向けることができますか?
Cory W.

2
jsには、 "background-color"のような特別な文字を持つフィールドがある場合があります。jsでそのようなフィールドにアクセスするには、obj ["background-color"]を実行します。動的オブジェクトに逆シリアル化した後、c#からそのようなフィールドにアクセスするにはどうすればよいですか?もちろん、obj.background-colorはできません。obj["background-color"]も機能​​しないようです。jsとまったく同じように、動的オブジェクトも同時に辞書としてアクセスできると便利です。
Radu Simionescu 2012

2
@RaduSimionescu私はおそらく少し遅れますが、多分これは将来の訪問者を助けるでしょう。フィールド名params(C#のキーワード)でも同じ問題が発生しました。に加えてTryGetMember、をオーバーライドできますTryGetIndex。これにより、JSとまったく同じ動作が得られます。その後、obj["params"]またはobj["background-color"]厄介なフィールド名を行うことができます。
マーティンエンダー

606

Json.NETを使用するのは非常に簡単です

dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

またusing Newtonsoft.Json.Linq

dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

string name = stuff.Name;
string address = stuff.Address.City;

ドキュメント:動的でのJSONのクエリ


9
@HotLicks:動的なイントロスペクションをするには、stuffのような何かを:foreach (Newtonsoft.Json.Linq.JProperty jproperty in stuff) { Console.WriteLine("jproperty.Name = {0}", jproperty.Name);}
マティアス・

11
JsonConvert.DeserializeObjectとJObject.Parseの違いは何ですか?答えは、両方を同じ方法で使用して同じことを行うことですが、違いについては説明していません。
cja 2014年

7
@TomPeplowこれを試しました。うまくいきませんでした。「JObjectは 'Name'を実装しない」と書かれています。
Lee Louviere、2015

4
@cja違いはありません:stackoverflow.com/questions/23645034/…–
nawfal

8
これを機能させることができません。問題をasyncメソッドの内部に限定しました。メソッドを同期化すると、期待どおりに動作します。しかし、この方法を作りasync、私はできません取得dynamic、私はちょうど得ますobject。明示的なキャストは何もしませんが、それでもobject。他に誰かがこれを経験していますか?
codeConcussion

295

これは、System.Web.Helpers.Jsonを使用して行うことができます。そのDecodeメソッドは、好きなようにトラバースできる動的オブジェクトを返します。

System.Web.Helpersアセンブリ(.NET 4.0)に含まれています。

var dynamicObject = Json.Decode(jsonString);

25
FYI System.Web.Helpers.dllには.net 4.0が必要ですが、.net 4.0には含まれていません。ASP.NET MVC 3でインストールできます
jbtule

7
このアセンブリは、Visual Studio 2012のAssembliesの下のExtensionsグループにあります
W3Max

1
ダイナミックの使用に関する問題?入力JSONのプロパティが含まれていない場合はどのように効率的に例外を処理することができます。..
ウサマ・カリル

5
モデルを強く入力したい場合は、必ずJson.Decode <T>(string)メソッドを使用してください。
マイク

2
:プロジェクトにこのライブラリを追加するにはstackoverflow.com/questions/8037895/...

80

.NET 4.0には、これを行うための組み込みライブラリがあります。

using System.Web.Script.Serialization;
JavaScriptSerializer jss = new JavaScriptSerializer();
var d = jss.Deserialize<dynamic>(str);

これが最も簡単な方法です。


27
これを試しましたか?戻りますDictionary<string,object>。私が何かを欠落していない限り、あなたの例は動的オブジェクトを返しません。
セルジオペレイラ

18
これは機能せず、動的な形式の
ディクテーションを

55
@ピーター・ロング私は私のケースをはっきりと述べられなかったと思います、親愛なるフェロー。エラーの修正を試みます。ダイナミックとは何か知っています。これは、JSONオブジェクトを渡してd.codeを使用することを許可しません。d["code"]。Valueを実行する必要があります。これは、この答えを見つけるほとんどの人が望んでいることではありません。辞書を取得して動的にキャストするのは、まったく時間の無駄です。私は敬意を払って同意しません、サー。
mattmanser

4
@mattmanser 、we already know how to get the dictionary and casting it to a dynamic. 辞書である必要はありません。Jsonには辞書の他にリストもあります。また、リストや辞書を入れ子にすることもできます。私のコードはこれらすべての状況を処理できます。しかし、あなたの方法はできません。
Peter Long

4
@mattmanserは正しいです。プロパティをインターセプトして内部ディクショナリでルックアップできる実装IDynamicMetaObjectProvider(またはを使用するなどExpandoObject)が可能 です。これとの使用を組み合わせると、dynamicなどのコードを使用できますd.code。辞書を動的変数にキャストするのは一種の無意味です。
Stephen Drew

78

サードパーティのDLLファイルなしでオブジェクトに単純な「文字列JSONデータ」:

WebClient client = new WebClient();
string getString = client.DownloadString("https://graph.facebook.com/zuck");

JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>(getString);
string name = item["name"];

//note: JavaScriptSerializer in this namespaces
//System.Web.Script.Serialization.JavaScriptSerializer

注:カスタムオブジェクトを使用することもできます。

Personel item = serializer.Deserialize<Personel>(getString);

4
わかりません。これは最も簡単な解決策であり、誰も言及していません。
cikatomo

2
はい、それは簡単です:)シリアル化が必要だが、サードパートDLLを含めたくない場合があります
somebrahimÖzbölük13年

どのように動的に非直列化されたオブジェクトにアクセスできるかについて詳しく説明できますmyObject["myprop"]か?私はそれが実行時に行われることを知っていますが、それを介してそれにアクセスすることmyObject["myprop"]はどのように有効ですか?
Royi Namir 2013

1
Personel item = serializer.Deserialize <Personel>(getString);のようにオブジェクトをデシリアライズできます。動的オブジェクトを使用する場合、配列も使用でき、everyobjectのようにすべてが可能です
everythingbrahimÖzbölükSep

3
System.Web.Script.Serialization名前空間を使用するには、プロジェクトにSystem.Web.Extensionsへの参照が必要です。
StilgarISCA 2018

28

JsonFxは、JSONコンテンツを動的オブジェクトに逆シリアルできます。

動的型とのシリアル化(.NET 4.0のデフォルト):

var reader = new JsonReader(); var writer = new JsonWriter();

string input = @"{ ""foo"": true, ""array"": [ 42, false, ""Hello!"", null ] }";
dynamic output = reader.Read(input);
Console.WriteLine(output.array[0]); // 42
string json = writer.Write(output);
Console.WriteLine(json); // {"foo":true,"array":[42,false,"Hello!",null]}

19

Expandoオブジェクトを使用するDynamicJsonConverterの新しいバージョンを作成しました。Json.NETを使用して動的をJSONにシリアル化したかったので、expandoオブジェクトを使用しました。

using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Dynamic;
using System.Web.Script.Serialization;

public static class DynamicJson
{
    public static dynamic Parse(string json)
    {
        JavaScriptSerializer jss = new JavaScriptSerializer();
        jss.RegisterConverters(new JavaScriptConverter[] { new DynamicJsonConverter() });

        dynamic glossaryEntry = jss.Deserialize(json, typeof(object)) as dynamic;
        return glossaryEntry;
    }

    class DynamicJsonConverter : JavaScriptConverter
    {
        public override object Deserialize(IDictionary<string, object> dictionary, Type type, JavaScriptSerializer serializer)
        {
            if (dictionary == null)
                throw new ArgumentNullException("dictionary");

            var result = ToExpando(dictionary);

            return type == typeof(object) ? result : null;
        }

        private static ExpandoObject ToExpando(IDictionary<string, object> dictionary)
        {
            var result = new ExpandoObject();
            var dic = result as IDictionary<String, object>;

            foreach (var item in dictionary)
            {
                var valueAsDic = item.Value as IDictionary<string, object>;
                if (valueAsDic != null)
                {
                    dic.Add(item.Key, ToExpando(valueAsDic));
                    continue;
                }
                var arrayList = item.Value as ArrayList;
                if (arrayList != null && arrayList.Count > 0)
                {
                    dic.Add(item.Key, ToExpando(arrayList));
                    continue;
                }

                dic.Add(item.Key, item.Value);
            }
            return result;
        }

        private static ArrayList ToExpando(ArrayList obj)
        {
            ArrayList result = new ArrayList();

            foreach (var item in obj)
            {
                var valueAsDic = item as IDictionary<string, object>;
                if (valueAsDic != null)
                {
                    result.Add(ToExpando(valueAsDic));
                    continue;
                }

                var arrayList = item as ArrayList;
                if (arrayList != null && arrayList.Count > 0)
                {
                    result.Add(ToExpando(arrayList));
                    continue;
                }

                result.Add(item);
            }
            return result;
        }

        public override IDictionary<string, object> Serialize(object obj, JavaScriptSerializer serializer)
        {
            throw new NotImplementedException();
        }

        public override IEnumerable<Type> SupportedTypes
        {
            get { return new ReadOnlyCollection<Type>(new List<Type>(new[] { typeof(object) })); }
        }
    }
}


14

Newtonsoft.Jsonの助けを借りてそれを実現できます。NugetおよびからNewtonsoft.Jsonをインストールします。

using Newtonsoft.Json;

dynamic results = JsonConvert.DeserializeObject<dynamic>(YOUR_JSON);

8

最も簡単な方法は次のとおりです。

このDLLファイルを含めるだけです

次のようなコードを使用します。

dynamic json = new JDynamic("{a:'abc'}");
// json.a is a string "abc"

dynamic json = new JDynamic("{a:3.1416}");
// json.a is 3.1416m

dynamic json = new JDynamic("{a:1}");
// json.a is

dynamic json = new JDynamic("[1,2,3]");
/json.Length/json.Count is 3
// And you can use json[0]/ json[2] to get the elements

dynamic json = new JDynamic("{a:[1,2,3]}");
//json.a.Length /json.a.Count is 3.
// And you can use  json.a[0]/ json.a[2] to get the elements

dynamic json = new JDynamic("[{b:1},{c:1}]");
// json.Length/json.Count is 2.
// And you can use the  json[0].b/json[1].c to get the num.

6

JavaScriptSerializerを拡張して、作成したディクショナリを再帰的にコピーしてexpandoオブジェクトにコピーし、動的に使用できます。

static class JavaScriptSerializerExtensions
{
    public static dynamic DeserializeDynamic(this JavaScriptSerializer serializer, string value)
    {
        var dictionary = serializer.Deserialize<IDictionary<string, object>>(value);
        return GetExpando(dictionary);
    }

    private static ExpandoObject GetExpando(IDictionary<string, object> dictionary)
    {
        var expando = (IDictionary<string, object>)new ExpandoObject();

        foreach (var item in dictionary)
        {
            var innerDictionary = item.Value as IDictionary<string, object>;
            if (innerDictionary != null)
            {
                expando.Add(item.Key, GetExpando(innerDictionary));
            }
            else
            {
                expando.Add(item.Key, item.Value);
            }
        }

        return (ExpandoObject)expando;
    }
}

次に、拡張機能を定義した名前空間のusingステートメントを用意するだけです(System.Web.Script.Serializationでそれらを定義することを考えてください...別のトリックは、名前空間を使用しないことです。その後、使用する必要はありません。ステートメントですべて)そして、あなたはそのようにそれらを消費することができます:

var serializer = new JavaScriptSerializer();
var value = serializer.DeserializeDynamic("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");

var name = (string)value.Name; // Jon Smith
var age = (int)value.Age;      // 42

var address = value.Address;
var city = (string)address.City;   // New York
var state = (string)address.State; // NY

6

使用できます using Newtonsoft.Json

var jRoot = 
 JsonConvert.DeserializeObject<dynamic>(Encoding.UTF8.GetString(resolvedEvent.Event.Data));

resolvedEvent.Event.Data コアイベントの呼び出しから得られる私の応答です。


6

JSONオブジェクトを表すクラスを取得するには、http://json2csharp.com/を使用します。

入力:

{
   "name":"John",
   "age":31,
   "city":"New York",
   "Childs":[
      {
         "name":"Jim",
         "age":11
      },
      {
         "name":"Tim",
         "age":9
      }
   ]
}

出力:

public class Child
{
    public string name { get; set; }
    public int age { get; set; }
}

public class Person
{
    public string name { get; set; }
    public int age { get; set; }
    public string city { get; set; }
    public List<Child> Childs { get; set; }
}

その後、Newtonsoft.Jsonを使用してクラスに入力します。

using Newtonsoft.Json;

namespace GitRepositoryCreator.Common
{
    class JObjects
    {
        public static string Get(object p_object)
        {
            return JsonConvert.SerializeObject(p_object);
        }
        internal static T Get<T>(string p_object)
        {
            return JsonConvert.DeserializeObject<T>(p_object);
        }
    }
}

次のように呼び出すことができます。

Person jsonClass = JObjects.Get<Person>(stringJson);

string stringJson = JObjects.Get(jsonClass);

PS:

JSON変数名が有効なC#名(名前がで始まる$)でない場合は、次のように修正できます。

public class Exception
{
   [JsonProperty(PropertyName = "$id")]
   public string id { get; set; }
   public object innerException { get; set; }
   public string message { get; set; }
   public string typeName { get; set; }
   public string typeKey { get; set; }
   public int errorCode { get; set; }
   public int eventId { get; set; }
}

5

そのために、JSON.NETを使用してJSONストリームの低レベルの解析を行い、ExpandoObjectクラスのインスタンスからオブジェクト階層を構築します。


5

私は私のコードでこのように使用しており、うまく機能しています

using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);

1
しかし、それは質問が尋ねていることではありません。すべてのjson文字列のタイプを指定し、動的タイプを操作する必要がある場合は、状況が異なります。
Illuminati

5

私がCodeProjectについて書いた記事を見てください。質問に正確に答えるものです:

JSON.NETを使用した動的型

ここにすべてを再投稿する方法は多すぎますが、その記事にはキー/必要なソースファイルが添付されているため、あまり重要ではありません。


5

別のオプションは、「JSONをクラスとして貼り付ける」ことです。これにより、すばやく簡単にデシリアライズできます。

  1. JSON全体をコピーするだけ
  2. Visual Studioの場合:「編集」形式を選択して貼り付け」「JSONをクラスとして貼り付け」をクリックします。

ここにpiccasのより良い説明があります... ASP.NETおよびWebツール2012.2 RCの「クラスとしてJSONを貼り付け」


これは私に多くの時間を節約しました!ベストアンサーとして選択してください。
jsiot

4

JSON.NETでの逆シリアル化はJObject、そのライブラリに含まれているクラスを使用して動的にすることができます。私のJSON文字列はこれらのクラスを表します:

public class Foo {
   public int Age {get;set;}
   public Bar Bar {get;set;}
}

public class Bar {
   public DateTime BDay {get;set;}
}

次に、上記のクラスを参照せずに文字列を逆シリアル化します。

var dyn = JsonConvert.DeserializeObject<JObject>(jsonAsFooString);

JProperty propAge = dyn.Properties().FirstOrDefault(i=>i.Name == "Age");
if(propAge != null) {
    int age = int.Parse(propAge.Value.ToString());
    Console.WriteLine("age=" + age);
}

//or as a one-liner:
int myage = int.Parse(dyn.Properties().First(i=>i.Name == "Age").Value.ToString());

または、さらに深く行きたい場合:

var propBar = dyn.Properties().FirstOrDefault(i=>i.Name == "Bar");
if(propBar != null) {
    JObject o = (JObject)propBar.First();
    var propBDay = o.Properties().FirstOrDefault (i => i.Name=="BDay");
    if(propBDay != null) {
        DateTime bday = DateTime.Parse(propBDay.Value.ToString());
        Console.WriteLine("birthday=" + bday.ToString("MM/dd/yyyy"));
    }
}

//or as a one-liner:
DateTime mybday = DateTime.Parse(((JObject)dyn.Properties().First(i=>i.Name == "Bar").First()).Properties().First(i=>i.Name == "BDay").Value.ToString());

完全な例については、投稿を参照してください。


このアプローチにより、jSONドキュメントを「トラバース」できるため、JSON構造が不明または可変である状況を管理できます(たとえば、多くのAPIは、エラーが発生したときに完全に異なるJSONドキュメントを返します)。Newtonsoft.JSON(別名JSON.NET)以外に、それを許可する他のライブラリがありますか?
Alex 75

4

必要なオブジェクトDynamicJSONObjectは、WebMatrixの一部であるASP.NET WebページパッケージのSystem.Web.Helpers.dllに含まれています。


4

SimpleJsonと呼ばれるC#用の軽量JSONライブラリがあります。

.NET 3.5以降、Silverlight、Windows Phone 7をサポートしています。

.NET 4.0のダイナミックをサポートします

NuGetパッケージとしてインストールすることもできます

Install-Package SimpleJson

4

JavaScriptでDataSet(C#)を使用します。DataSet入力でJSONストリームを作成するための単純な関数。(マルチテーブルデータセット)のようなJSONコンテンツを作成します。

[[{a:1,b:2,c:3},{a:3,b:5,c:6}],[{a:23,b:45,c:35},{a:58,b:59,c:45}]]

クライアント側のみ、evalを使用します。例えば、

var d = eval('[[{a:1,b:2,c:3},{a:3,b:5,c:6}],[{a:23,b:45,c:35},{a:58,b:59,c:45}]]')

次に使用します:

d[0][0].a // out 1 from table 0 row 0

d[1][1].b // out 59 from table 1 row 1

// Created by Behnam Mohammadi And Saeed Ahmadian
public string jsonMini(DataSet ds)
{
    int t = 0, r = 0, c = 0;
    string stream = "[";

    for (t = 0; t < ds.Tables.Count; t++)
    {
        stream += "[";
        for (r = 0; r < ds.Tables[t].Rows.Count; r++)
        {
            stream += "{";
            for (c = 0; c < ds.Tables[t].Columns.Count; c++)
            {
                stream += ds.Tables[t].Columns[c].ToString() + ":'" +
                          ds.Tables[t].Rows[r][c].ToString() + "',";
            }
            if (c>0)
                stream = stream.Substring(0, stream.Length - 1);
            stream += "},";
        }
        if (r>0)
            stream = stream.Substring(0, stream.Length - 1);
        stream += "],";
    }
    if (t>0)
        stream = stream.Substring(0, stream.Length - 1);
    stream += "];";
    return stream;
}

3

ExpandoObjectを取得するには:

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;

Container container = JsonConvert.Deserialize<Container>(jsonAsString, new ExpandoObjectConverter());

3

これを試して:

  var units = new { Name = "Phone", Color= "White" };
    var jsonResponse = JsonConvert.DeserializeAnonymousType(json, units);

3

ダイナミック&JavaScriptSerializerで簡単なJSONコンテンツを解析する方法

System.Web.Extensionsの参照を追加し、この名前空間using System.Web.Script.Serialization;を先頭に追加してください:

public static void EasyJson()
{
    var jsonText = @"{
        ""some_number"": 108.541,
        ""date_time"": ""2011-04-13T15:34:09Z"",
        ""serial_number"": ""SN1234""
    }";

    var jss = new JavaScriptSerializer();
    var dict = jss.Deserialize<dynamic>(jsonText);

    Console.WriteLine(dict["some_number"]);
    Console.ReadLine();
}

動的&JavaScriptSerializerを使用してネストされた複雑なJSONを解析する方法

System.Web.Extensionsの参照を追加し、この名前空間using System.Web.Script.Serialization;を先頭に追加してください:

public static void ComplexJson()
{
    var jsonText = @"{
        ""some_number"": 108.541,
        ""date_time"": ""2011-04-13T15:34:09Z"",
        ""serial_number"": ""SN1234"",
        ""more_data"": {
            ""field1"": 1.0,
            ""field2"": ""hello""
        }
    }";

    var jss = new JavaScriptSerializer();
    var dict = jss.Deserialize<dynamic>(jsonText);

    Console.WriteLine(dict["some_number"]);
    Console.WriteLine(dict["more_data"]["field2"]);
    Console.ReadLine();
}

1

Cinchoo ETL:動的オブジェクトにJSONをパースするために利用できるオープンソースのライブラリ-

string json = @"{
    ""key1"": [
        {
            ""action"": ""open"",
            ""timestamp"": ""2018-09-05 20:46:00"",
            ""url"": null,
            ""ip"": ""66.102.6.98""
        }
    ]
}";
using (var p = ChoJSONReader.LoadText(json)
    .WithJSONPath("$.*")
    )
{
    foreach (var rec in p)
    {
        Console.WriteLine("Action: " + rec.action);
        Console.WriteLine("Timestamp: " + rec.timestamp);
        Console.WriteLine("URL: " + rec.url);
        Console.WriteLine("IP address: " + rec.ip);
    }
}

出力:

Action: open
Timestamp: 2018-09-05 20:46:00
URL: http://www.google.com
IP address: 66.102.6.98

免責事項:私はこのライブラリの作者です。


0

このようにしてみてください!

JSONの例:

  [{
            "id": 140,
            "group": 1,
            "text": "xxx",
            "creation_date": 123456,
            "created_by": "xxx@gmail.co",
            "tags": ["xxxxx"]
        }, {
            "id": 141,
            "group": 1,
            "text": "xxxx",
            "creation_date": 123456,
            "created_by": "xxx@gmail.com",
            "tags": ["xxxxx"]
        }]

C#コード:

        var jsonString = (File.ReadAllText(Path.Combine(Directory.GetCurrentDirectory(),"delete_result.json")));
        var objects = JsonConvert.DeserializeObject<dynamic>(jsonString);
        foreach(var o in objects)
        {
            Console.WriteLine($"{o.id.ToString()}");
        }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.