Преобразовать строку JSON в объект C # - PullRequest
165 голосов
/ 06 января 2011

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

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

Проблема в том, что rout_list никогда не устанавливается;это неопределенный объект.Есть идеи?

Ответы [ 13 ]

178 голосов
/ 16 февраля 2013

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

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

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

120 голосов
/ 06 января 2011

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

53 голосов
/ 06 января 2011

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

Если вы действительно хотите, чтобы этот код работал так, как есть, вам понадобитсязнать, что объект, возвращаемый DeserializeObject, является общим словарем строки object.Вот код, который делает это следующим образом:

var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);

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

Если вы объявите классили структура, вы можете вызвать 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);
    }
}
28 голосов
/ 16 апреля 2013

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

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

//test Result = "some data"
18 голосов
/ 21 января 2015

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

решение с одной строкой кода.

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

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
13 голосов
/ 16 сентября 2011

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

Приведенный ниже код можно запустить в LinqPad для проверки:

  • Щелкните правой кнопкой мыши на вкладке скрипта в LinqPad и выберите «Запрос» Свойства "
  • Ссылка на «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;
  }
}
10 голосов
/ 17 июня 2015

Вы можете легко выполнить ваши требования с помощью библиотеки 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.

7 голосов
/ 17 июля 2012

добавить этот 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);
6 голосов
/ 26 октября 2018

Как сказал tripletdad99

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

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

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
4 голосов
/ 03 ноября 2017

Другой быстрый и простой способ полуавтоматизации этих шагов:

  1. возьмите JSON, который вы хотите проанализировать, и вставьте его здесь: http://json2csharp.com/, затем скопируйте и вставьте полученный результат в новый класс (например, MyClass) в visual studio.
  2. Переименуйте «RootObject» в выводе из json2csharp в «MyClass» или как вы его назвали.
  3. В visual studio перейдите на Веб-сайт -> Управление пакетами и используйте 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...