Десеріалізувати JSON в динамічний об'єкт C #?


965

Чи є спосіб дезаріалізувати вміст JSON в динамічний тип C # 4? Було б непогано пропустити створення класів, щоб використовувати DataContractJsonSerializer.


5
Якщо ви хочете чогось "динамічного", чому б не просто використовувати аксесуари get-style, які поставляються з більшістю декодерів JSON, які не переходять на звичайний-старий-об'єкт? (наприклад, чи справді потрібно створити "динамічне" створення об'єктів?) json.org має купу посилань для реалізації C # JSON.

Я працюю над проектом, який намагається звести зовнішні залежності до мінімуму. Тож, якщо можливо, щось із серіалізаторами .net та типом, які було б бажано. Звичайно, якщо це неможливо, я натискаю на json.org. Дякую!
jswanson

42
Я дуже здивований, що команда C # додала "динамічний", але тоді в CLR немає можливості перетворити об'єкт JSON в екземпляр класу динамічного CLR.
Френк Швітерман

2
На жаль, прийнята відповідь не працює в .NET 4 RTM. Я опублікував відповідь, яка допомогла мені піти з цим, що може бути корисним для інших.
Дрю Ноакс

(Хоча, схоже, що Newtonsoft JSON.NET дуже близький. Однак, не дуже хороших прикладів.)
Hot Licks

Відповіді:


659

Якщо ви раді мати залежність від System.Web.Helpersскладання, то ви можете використовувати Jsonклас:

dynamic data = Json.Decode(json);

Він входить у рамку MVC як додаткове завантаження в .NET 4. Обов’язково надайте Владу нагороду, якщо це корисно! Однак якщо ви не можете припустити, що середовище клієнта включає цю 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 чи що?
Стюі Гріффін

32
Можна використовувати System.Web.Helpers.Json - він пропонує метод Decode, який повертає динамічний об’єкт. Я також опублікував цю інформацію як відповідь.
Влад Ілієску

2
Це також мені дуже допомогло, але мені цікаво, що мені робити, якщо мені потрібно використовувати метод .Serialize, який наразі видає NotImplementedException ... Я не надто знайомий із запечатаними класами та / або розширеним конспектом заняття. Чи може хтось вказати мене в правильному напрямку?
Cory W.

2
іноді у js у вас є поля зі спеціальними символами на кшталт "background-color". Для доступу до таких полів у js ви робіть obj ["background-color"]. Як я можу отримати доступ до таких полів з c # після деріаріалізації до динамічного об'єкта? Я, звичайно, не можу зробити obj.background-color, і obj ["background-color"], здається, не працює. Було б добре, якби динамічний об’єкт також міг отримати доступ до словника, в той же час, точно так само, як у js.
Раду Сіміонеску

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

7
@TomPeplow Спробував це. Це не працювало для мене. У ньому сказано, що "JObject не реалізує" Ім'я "".
Лі Лув'є

4
НЕ @cja ніякої різниці: stackoverflow.com/questions/23645034 / ...
Навфал

7
Я не можу змусити це працювати. Я звузив проблему до того, щоб бути всередині asyncметоду. Якщо я зроблю метод синхронним, він працює як очікувалося. Однак зробіть метод, asyncі я не можу отримати dynamic, я просто отримаю object. Явний кастинг нічого не робить, все ще просто дає мені object. Хтось ще відчуває це?
codeConcussion

295

Це можна зробити за допомогою System.Web.Helpers.Json - його метод декодування повертає динамічний об’єкт, який ви можете пересувати, як вам подобається.

Він включений у збірку 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
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>. Якщо я щось не пропускаю, ваш приклад не повертає динамічний об’єкт.
sergiopereira

18
Це не працює, воно просто повертає дикт у вигляді динаміки
mattmanser

55
@ Петер Довгий Я вважаю, що не зміг чітко заявити про свою справу, дорогий колег. Дозвольте спробувати виправити свою помилку. Я знаю, що таке динаміка. Це не дозволяє вам переходити в об’єкт JSON і використовувати d.code, вам доведеться робити d ["code"] Значення, яке не те, чого хоче більшість людей, які знаходять цю відповідь, ми вже знаємо, як це зробити отримати словник і передати його динамічним - це загальна витрата часу. Я з повагою не згоден, сер.
mattmanser

4
@mattmanser, we already know how to get the dictionary and casting it to a dynamic. Це не повинно бути роздумом. У Json також є словники, крім словника. А також можна вкладати списки та словники. Мій код міг би впоратися з усіма цими ситуаціями. АЛЕ ваш метод НЕ МОЖЕ.
Пітер Лонг

4
@mattmanser має рацію; можна реалізувати IDynamicMetaObjectProvider(або використовувати напр. ExpandoObject), який здатний перехоплювати властивості та шукати їх у внутрішньому словнику. Це поєднується з використанням dynamicдозвольного коду, d.codeякий можна використовувати. Створювати словник динамічно, безглуздо.
Стівен Дрю

78

Простий "рядок даних JSON" для об'єкта без стороннього файлу DLL:

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
İbrahim Özbölük

Чи можете ви детальніше розглянути: як динамічно можна отримати доступ до об'єкта DEserialized через myObject["myprop"]:? Я знаю, що це робиться під час виконання, але як доступ до нього за допомогою myObject["myprop"]дійсний?
Рой Намір

1
Ви можете десериалізувати об'єкт, наприклад, Personel item = serializer.Deserialize <Personel> (getString); і якщо ви використовуєте динамічний об'єкт, ви також можете використовувати масив, і все можливо, як і кожен об'єкт
İbrahim Özbölük,

3
Для використання простору імен System.Web.Script.Serialization ваш проект потребує посилання на System.Web.Extensions.
StilgarISCA

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

Я створив нову версію DynamicJsonConverter, яка використовує об'єкти Expando. Я використовував об'єкти експандо, тому що хотів серіалізувати динамічну назад в JSON за допомогою Json.NET.

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. Встановіть Newtonsoft.Json з Nuget та:

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, щоб рекурсивно копіювати створений ним словник для розширення об'єктів (ів) і потім використовувати їх динамічно:

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

Тоді вам просто необхідно мати оператор використання для простору імен, для якого ви визначили розширення (розгляньте, як просто визначити їх у 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

Я використовую http://json2csharp.com/, щоб отримати клас, що представляє об'єкт JSON.

Вхід:

{
   "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 та працювати з динамічним типом.
Ілюмінати

5

Подивіться статтю, яку я написав на CodeProject, таку, яка точно відповідає на питання:

Динамічні типи з JSON.NET

Тут є занадто багато разів для повторного розміщення тут, і ще менше моменту, оскільки ця стаття містить додаток до ключа / необхідного вихідного файлу.


5

Інший варіант - "Вставити JSON як класи", щоб його можна було швидко і просто десеріалізувати.

  1. Просто скопіюйте весь JSON
  2. У Visual Studio: Клацніть ПравкаСпеціальна вставкаВставити JSON як класи

Ось краще пояснення на пікасах ... "Вставити JSON як класи" в ASP.NET та веб-інструментах 2012.2 RC


це врятувало мені багато часу! слід обрати як найкращу відповідь!
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)?
Алекс 75

4

Об'єкт, який потрібно DynamicJSONObject, включений до System.Web.Helpers.dll з пакету веб-сторінок ASP.NET, який є частиною WebMatrix.


4

Існує легка бібліотека JSON для C # під назвою SimpleJson .

Він підтримує .NET 3.5+, Silverlight та Windows Phone 7.

Він підтримує динаміку для .NET 4.0

Його також можна встановити як пакет NuGet

Install-Package SimpleJson

4

Використовуйте DataSet (C #) за допомогою JavaScript. Проста функція створення потоку JSON з входом DataSet. Створіть на зразок контенту 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

Як легко проаналізувати вміст JSON за допомогою динамічного та JavaScriptSerializer

Будь ласка, додайте посилання на 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();
}

Як розібрати вкладений і складний json з динамічним & JavaScriptSerializer

Будь ласка, додайте посилання на 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()}");
        }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.