it-swarm-tr.com

JSON'u C # dinamik nesneye seri hale getirme?

JSON içeriğini C # 4 dinamik türünde seri hale getirmenin bir yolu var mı? DataContractJsonSerializer'ı kullanmak için bir grup ders oluşturmayı atlamak iyi olurdu. 

839
jswanson

System.Web.Helpers Assembly'ye bağımlı olduğunuzdan memnunsanız, Json sınıfını kullanabilirsiniz:

dynamic data = Json.Decode(json);

MVC çerçevesine .NET/4 çerçevesine ek bir indirme olarak eklenmiştir. Yararlı olursa Vlad'a bir şans vermeyi unutma! Ancak, istemci ortamının bu DLL dosyasını içerdiğini varsayamazsanız, okumaya devam edin.


Alternatif bir seriyi kaldırma yaklaşımı here önerilmektedir. Bir hatayı düzeltmek ve kodlama stilime uyacak şekilde kodu biraz değiştirdim. Tek ihtiyacınız olan bu kod ve projenizdeki System.Web.Extensions referansı:

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
}

Bu şekilde kullanabilirsiniz:

string json = ...;

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

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

Yani, bir JSON dizesi verilen:

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

Aşağıdaki kod çalışma zamanında çalışır:

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)
600
Drew Noakes

Json.NET kullanarak oldukça basit.

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

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

Ayrıca 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;

Belgeler: JSON'u dinamik olarak sorgulama

540
Tom Peplow

Bunu, System.Web.Helpers.Json - kod çözme yöntemini kullanarak yapabilirsiniz, istediğiniz gibi hareket ettirebileceğiniz dinamik bir nesne döndürür.

System.Web.Helpers Assembly'de (.NET 4.0) bulunur.

var dynamicObject = Json.Decode(jsonString);
287
Vlad Iliescu

.NET 4.0 bunu yapmak için yerleşik bir kitaplığa sahiptir:

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

Bu en basit yoldur.

78
Peter Long

Herhangi bir üçüncü taraf dll'siz nesneye basit "string json data"

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 

Not: Özel nesnenizi de kullanabilirsiniz. 

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

JsonFx, json'u dinamik nesnelere seri hale getirebilir.

https://github.com/jsonfx/jsonfx

Dinamik türlere/dinamik türlere göre seri hale getirme (.NET 4.0 için varsayılan):

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]}
28
jbtule

Expando Nesneleri kullanan DynamicJsonConverter'ın yeni bir versiyonunu yaptım. Expando nesneleri kullandım çünkü Json.net'i kullanarak dinamik olanı json'a seri hale getirmek istedim.

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) })); }
        }
    }
}  
18
Jason Bolton

Newtonsoft.Json kullanarak başka bir yol:

dynamic stuff = Newtonsoft.Json.JsonConvert.DeserializeObject("{ color: 'red', value: 5 }");
string color = stuff.color;
int value = stuff.value;
14
Jonas Lundgren

En basit yol 

Sadece şunu ekleyin: dll

kodu böyle kullan

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.
7
user1006544

Expando nesnelerine oluşturmak için oluşturduğu sözlüğü yinelemeli olarak kopyalamak ve sonra bunları dinamik olarak kullanmak için JavaScriptSerializer'ı genişletebilirsiniz:

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;
    }
}

O zaman sadece uzantıyı tanımladığınız ad alanı için bir use ifadesine sahip olmanız gerekir (bunları yalnızca System.Web.Script.Serialization ... 'da tanımlamayı düşünün. hiç açıklama) ve onları böyle tüketebilirsiniz:

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
alonzofox

using Newtonsoft.Json kullanabilirsiniz

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

resolvedEvent.Event.Data, cevabımın temel olayı olarak adlandırılmasıdır.

6
Vivek Shukla

Json Nesnesini temsil eden A sınıfı almak için: http://json2csharp.com/

Giriş:

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

Çıktı:

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; }
}

Ondan sonra sınıfı doldurmak için Newtonsoft.Json kullanın:

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);
        }
    }
}

Buna şöyle diyebilirsin:

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

string stringJson = JObjects.Get(jsonClass);

PS: 

Eğer json değişken isminiz geçerli bir C # ismi değilse (isim $ ile başlar) şöyle düzeltebilirsiniz:

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
RoJaIt

Bunun için JSON.NET'i kullanarak JSON akışının düşük seviyeli ayrıştırmasını yapar ve ardından ExpandoObject sınıfının örneklerinden nesne hiyerarşisini oluşturur.

5
Daniel Earwicker

Soruyu tam olarak yanıtlayan CodeProject'te yazdığım makaleye bakın:

JSON.NET ile dinamik tipler

Hepsini buraya yeniden göndermek için çok fazla şey var ve bu makalede, anahtar/gerekli kaynak dosyayla bir eki olduğu için daha da az nokta var.

5
vitaly-t

Kodumda bu gibi kullanıyorum ve iyi çalışıyor

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

C # için SimpleJson adında hafif bir json kütüphanesi bulunur. http://simplejson.codeplex.com https://github.com/facebook-csharp-sdk/simple-json

Net 3.5+, Silverlight ve Windows Phone 7'yi destekler.

Net 4.0 için dinamik destekler

Bir nuget paketi olarak da kurulabilir

Install-Package SimpleJson
4
prabir

JSON.NET'te seriyi kaldırma, o kütüphanede bulunan JObject sınıfı kullanılarak dinamik olabilir. JSON dizgim şu sınıfları temsil ediyor:

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

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

Şimdi yukarıdaki sınıfları referans alarak WITHOUT dizgesini serileştiriyoruz:

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());

Ya da daha derine gitmek istersen:

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());

Tam bir örnek için bkz. post .

4
Chad Kuehn

dataSet (C #) kullanın javascript .__ ile. DataSet girdisi ile json akışı oluşturmak için basit bir işlev.. json like (çoklu tablo veri kümesi) .__ ile oluşturun. a: 3 b: 5, c: 6}], [{a: 23, B: 45, c: 35}, {a: 58, B: 59, c: 45}]]

Örneğin sadece müşteri tarafında kullanım 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}]] ')

sonra kullan 

d [0] [0] .a // tablo 1 satır 1'den 0

d [1] [1] .b // tablo 1 satır 1’den 59’u

//create 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;
}
4
Behnam Mohammadi

bunu dene - 

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

Size yardımcı olmak için muhtemelen biraz geç ama DynamicJSONObject'i istediğiniz nesneyi WebMatrix'in bir parçası olan ASP.NET Web Pages paketinden System.Web.Helpers.dll dosyasına dahil edin.

4
Nick Daniels

Bir ExpandoObject almak için:

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

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

Dinamik ve JavaScriptSerializer ile kolay json ayrıştırma

Lütfen System.Web.Extensions 'in referansını ekleyin ve bu ad alanını using System.Web.Script.Serialization;' nin üstüne ekleyin.

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();
}

İç içe ve karmaşık json'u dinamik ve JavaScriptSerializer ile ayrıştırma

Lütfen System.Web.Extensions 'in referansını ekleyin ve bu ad alanını using System.Web.Script.Serialization;' nin üstüne ekleyin.

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();
}
2
Mist

Bunu Newtonsoft.Json'un yardımı ile başarabilirsiniz. Nugtons ve Newtonsoft.Json yükleyin:

using Newtonsoft.Json;

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

Diğer bir seçenek de "JSON'u sınıf olarak yapıştırmak" dır, bu sayede seri ve hızlı bir şekilde seri hale getirilebilir.

  1. Tüm JSON'unuzu kopyalamanız yeterli
  2. VS'de: Düzenle> Özel Yapıştır> JSON'u sınıf olarak yapıştırın'ı tıklatın.

İşte daha iyi bir açıklama n piccas ... https://blogs.msdn.Microsoft.com/webdev/2012/12/18/paste-json-as-classes-in-asp-net-and-web- Araçlar-2012-2-rc/

1
nitsram

bu şekilde dene!

JSON örneği:

  [{
            "id": 140,
            "group": 1,
            "text": "xxx",
            "creation_date": 123456,
            "created_by": "[email protected]",
            "tags": ["xxxxx"]
        }, {
            "id": 141,
            "group": 1,
            "text": "xxxx",
            "creation_date": 123456,
            "created_by": "[email protected]",
            "tags": ["xxxxx"]
        }]

C # kodu:

        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()}");
        }
0
Blue Steel

Cinchoo ETL - ile json'u dinamik nesneye ayrıştırmak için açık kaynaklı bir kütüphane

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: " + rec.ip);
    }
}

Çıktı:

action: open
timestamp: 2018-09-05 20:46:00
url: http://www.google.com
ip: 66.102.6.98

Feragatname: Bu kütüphanenin yazarıyım.

0
RajN