Преобразование строки JSON в объект С#

Попытка конвертировать строку JSON в объект в С#. Используя действительно простой тестовый пример:

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

Проблема заключается в том, что route_list никогда не устанавливается; это объект undefined. Любые идеи?

Ответ 1

Похоже, вы пытаетесь десериализоваться на необработанный объект. Вы можете создать класс, который представляет объект, к которому вы конвертируете. Это было бы очень полезно в случаях, когда вы имеете дело с более крупными объектами или строками 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

Ответ 2

Или вы можете использовать библиотеку Newtownsoft.Json следующим образом:

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

Где T - ваш тип объекта, который соответствует вашей строке JSON.

Ответ 3

Вероятно, вы не хотите просто объявлять route_list как тип object. У него нет свойства .test, поэтому вы действительно не получите хороший объект назад. Это одно из тех мест, где вам будет лучше определять класс или структуру или использовать динамическое ключевое слово.

Если вы действительно хотите, чтобы этот код работал так, как он есть, вам нужно знать, что объект, возвращаемый 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"]);

Если вы хотите использовать динамическое ключевое слово, вы можете прочитать, как здесь.

Если вы объявляете класс или структуру, вы можете вызвать Deserialize вместо DeserializeObject следующим образом:

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

Ответ 4

Использование динамического объекта с JavaScriptSerializer.

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

//test Result = "some data"

Ответ 5

Newtonsoft быстрее, чем java script serializer.... это зависит от пакета Newtonsoft NuGet, который популярен и лучше, чем сериализатор по умолчанию.

однострочное решение.

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

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

Ответ 6

Вот простой класс, который я вымотал из разных постов.... Он был протестирован около 15 минут, но, похоже, работает для моих целей. Он использует JavascriptSerializer для выполнения работы, на которую можно ссылаться в вашем приложении, используя подробную информацию в этом сообщении.

Следующий код можно запустить в LinqPad, чтобы проверить его:

  • Щелкните правой кнопкой мыши на вкладке script в LinqPad и выберите "Query Свойства "
  • Ссылка на "System.Web.Extensions.dll" в "Дополнительные ссылки"
  • Добавление дополнительного импорта пространства имен "System.Web.Script.Serialization".

Надеюсь, что это поможет!

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

Ответ 7

Вы можете легко выполнить свое требование, используя библиотеку Newtonsoft.Json. Я записываю один пример ниже, чтобы посмотреть на него.

Класс для типа получаемого вами объекта:

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.

Ответ 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);

Ответ 9

Еще один быстрый и простой способ полуавтоматизировать эти шаги:

  • возьмите JSON, который вы хотите разобрать и вставьте здесь: http://json2csharp.com/, затем скопируйте и вставьте полученный в новый класс (ex: MyClass) в визуальной студии.
  • Переименуйте "RootObject" в выход из json2csharp в "MyClass" или как вы его назвали.
  • В визуальной студии перейдите на сайт → Управление пакетами и используйте NuGet для добавления Json.Net из Newtonsoft.

Теперь используйте код:

WebClient client = new WebClient();

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

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

Ответ 10

Как сказал tripletdad99

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

но если вы не хотите создавать дополнительный объект, вы можете сделать это с помощью Dictionary

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

Ответ 11

Преобразование строки JSON в объект в С#. Используя ниже тестовый пример, он работал на меня. Здесь MenuInfo - мой объект класса С#.

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

Ответ 12

Сначала вы должны включить библиотеку, например:

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

Ответ 13

Скопируйте свой Json и вставьте его в текстовое поле на json2csharp и нажмите кнопку "Создать".

Класс CS будет создан с использованием этого файла CS, как показано ниже

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

Где RootObject - имя сгенерированного файла cs;