Десериализовать JSON в C # динамический объект? - PullRequest
879 голосов
/ 29 июня 2010

Есть ли способ десериализации содержимого JSON в динамический тип C # 4? Было бы неплохо пропустить создание группы классов, чтобы использовать DataContractJsonSerializer.

Ответы [ 25 ]

6 голосов
/ 26 июня 2017

Вы можете использовать using Newtonsoft.Json

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

resolvedEvent.Event.Data - мой ответ, получаемый при вызове основного события.

5 голосов
/ 29 июня 2010

Для этого я бы использовал JSON.NET для низкоуровневого анализа потока JSON, а затем выстроил иерархию объектов из экземпляров класса ExpandoObject.

5 голосов
/ 10 июня 2017

Я использую 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 голосов
/ 04 августа 2013

Посмотрите на статью, которую я написал на CodeProject, которая точно отвечает на вопрос:

Динамические типы с JSON.NET

Слишком много-постанем все это здесь, и еще меньше смысла, так как в этой статье есть вложение с ключом / необходимым исходным файлом.

5 голосов
/ 10 августа 2015

Я использую как это в моем коде, и он работает нормально

using System.Web.Script.Serialization;
JavaScriptSerializer oJS = new JavaScriptSerializer();
RootObject oRootObject = new RootObject();
oRootObject = oJS.Deserialize<RootObject>(Your JSon String);
4 голосов
/ 20 декабря 2010

Объект, который требуется DynamicJSONObject, включен в System.Web.Helpers.dll из пакета веб-страниц ASP.NET, который является частью WebMatrix.

4 голосов
/ 30 июля 2015

Десериализация в 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());

См. post для полного примера.

4 голосов
/ 07 марта 2015

Попробуйте это:

  var units = new { Name = "Phone", Color= "White" };
    var jsonResponse = JsonConvert.DeserializeAnonymousType(json, units);
4 голосов
/ 28 января 2014

Использовать 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;
}
4 голосов
/ 29 мая 2011

Существует легкая библиотека JSON для C #, которая называется SimpleJson .

Поддерживает .NET 3.5+, Silverlight и Windows Phone 7.

Поддерживает динамический для .NET 4.0

Он также может быть установлен как пакет NuGet

Install-Package SimpleJson
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...