Мне нужно получить ответ от json, а затем получить значения [duplicate]

В моем случае у меня была эта проблема, когда я создавал резервную копию базы данных, используя выходные / выходные символы перенаправления linux. Поэтому я изменяю синтаксис, как описано ниже. PS: использование терминала linux или mac.

Резервное копирование (без> перенаправления)

  # mysqldump -u root -p databasename -r bkp.sql   

Восстановить (без & lt; redirect)

  # mysql -u root -p --default-character-set = utf8 databasename mysql & gt;  Имена SET «utf8» mysql & gt;  SOURCE bkp.sql  

Ошибка «Указанный ключ был слишком длинным, максимальная длина ключа - 767 байт» исчезла.

132
задан yoozer8 26 November 2012 в 19:54
поделиться

10 ответов

Похоже, вы пытаетесь десериализоваться на необработанный объект. Вы можете создать класс, который представляет объект, к которому вы конвертируете.

Например:

  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

103
ответ дан Phas1c 17 August 2018 в 10:10
поделиться
  • 1
    Но в заостренной статье используются автопромышленности. Это тоже стоит упомянуть. – Ivan Kochurkin 18 September 2012 в 13:50
  • 2
    Извините, но этот пример кода не работает. Исключение составляет DeserializeObject. Используйте var routes_list = serializer.Deserialize & lt; Test & gt; (& quot; {\ & quot; test \ & quot;: \ & quot; некоторые данные \ & quot;} & quot;); вместо. Кроме того, вам не нужны get / setTest () и тест String, должны быть общедоступными. Это больше похоже на java, чем на C #. – dvallejo 8 October 2013 в 17:47
  • 3
    как отметил Дэн Валлехо, это неправильное решение. В конце концов, setTest (String test) не возвращается, что также является ошибкой компиляции. – Payam 18 August 2014 в 04:05
  • 4
    Можно также использовать это: json_serializer.Deserialize & lt; Test & gt; («{\ & quot; test \ & quot;: \ & quot; некоторые данные \ & quot;}"); // вместо (Test) json_serializer ..... – Bashar Abu Shamaa 23 December 2015 в 13:26
  • 5
    Если вы не знаете формат для объекта класса, попробуйте эту ссылку . Он переводит вашу строку Json в нужные классы. Сэкономил мне массу времени! – jade290 22 January 2016 в 17:03

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

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);
}
0
ответ дан 0xdb 17 August 2018 в 10:10
поделиться

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

Нижеприведенный код может быть запущен в LinqPad для его проверки out:

  • Щелкните правой кнопкой мыши на вкладке скрипта в 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;
  }
}
50
ответ дан Community 17 August 2018 в 10:10
поделиться
  • 1
    Выполнение: json_serializer = новый JavaScriptSerializer (); object routes_list = (IDictionary & lt; string, object & gt;) json_serializer.DeserializeObject (& quot; {\ & quot; test \ & quot;: \ & quot; некоторые данные здесь \ & quot;} & quot;); Все еще получение «routes_list» не существует в текущем контексте. – Justin 6 January 2011 в 03:00
  • 2
    Не используйте object routes_list. Используйте var или явно повторяйте себя и объявите route_list как IDictionary & lt; string, object & gt ;. – mattmc3 6 January 2011 в 03:06
  • 3
    Это сработало для меня, спасибо !!, выбранное решение НЕ! – Jhollman Cutcsa 23 January 2015 в 16:10

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

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

//test Result = "some data"
25
ответ дан İbrahim Özbölük 17 August 2018 в 10:10
поделиться

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

  1. взять JSON, который вы хотите разобрать и вставить здесь: http://json2csharp.com/ , затем скопируйте и вставьте полученный в новый класс (например: MyClass) в визуальной студии.
  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);
4
ответ дан Jason Hitchings 17 August 2018 в 10:10
поделиться

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

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

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

125
ответ дан Legends 17 August 2018 в 10:10
поделиться
  • 1
    Это так просто, и я так долго думал о том, как это сделать. – maracuja-juice 12 June 2017 в 12:21

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

9
ответ дан Mirza Danish Baig 17 August 2018 в 10:10
поделиться

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

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);
0
ответ дан MNie 17 August 2018 в 10:10
поделиться

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

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

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

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
16
ответ дан MSTdev 17 August 2018 в 10:10
поделиться

добавьте этот ddl для ссылки на ваш проект: System.Web.Extensions.dll

используют это пространство имен: using 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);
5
ответ дан Thulasiram 17 August 2018 в 10:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: