Пытаюсь преобразовать строку JSON в объект на C#. Используя действительно простой тестовый пример:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Проблема в том, что routes_list никогда не устанавливается; это неопределенный объект. Есть идеи?
Или, вы можете использовать Newtownsoft.JSON-библиотекой следующим образом:
using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);
Где T
- это тип объекта, который соответствует вашей строку JSON.
Похоже, что вы пытаетесь десериализовать необработанный объект. Вы можете создать класс, представляющий объект, в который вы конвертируете. Это было бы наиболее полезно в случаях, когда вы имеете дело с большими объектами или строками 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
Возможно, вы не захотите просто объявлять routes_list как тип object
. У него нет свойства .test, поэтому вы действительно не получите красивый объект обратно. Это одно из тех мест, где лучше определить класс или структуру, или использовать ключевое слово dynamic.
Если вы действительно хотите, чтобы этот код работал так, как он у вас есть, вам нужно знать, что объект, возвращаемый 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"]);
Если вы хотите использовать ключевое слово 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);
}
}
Используя динамический объект С класс javascriptserializer.
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];
//test Result = "some data"
Newtonsoft быстрее, чем Java скрипт сериализатор. ... это зависит от пакета NuGet Newtonsoft, который пользуется популярностью и лучше, чем сериализатор по умолчанию.
одним из решений код строки.
var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);
Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
Вот'простой класс, который я собрал из различных постов..... Он был протестирован в течение 15 минут, но кажется работает для моих целей. Он использует JavascriptSerializer
для выполнения работы, на который можно ссылаться в вашем приложении, используя подробную информацию в этом посте.
Приведенный ниже код можно запустить в LinqPad, чтобы проверить его:
Надеюсь, это поможет!
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;
}
}
Вы можете легко выполнить ваши требования с помощью 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.
Как tripletdad99 сказал
var result = JsonConvert.DeserializeObject<T>(json);
но если вы Don'т хотите создать дополнительный объект, вы можете сделать это вместо словарь
var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
добавить этот DDL, чтобы ссылка на ваш проект: System.Web.Extensions.dll
использовать это пространство имен: использование системы.Веб.Сценарий.Сериализация;
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);
Скопировать ваш JSON и вставить в текстовое поле на json2csharp и нажмите на кнопку Создать.
С КС класса будет сгенерирован использовать, что CS файл, как показано ниже
var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);
Где RootObject-это имя созданного КС файл;
Еще один быстрый и легкий способ полу-автоматизировать эти шаги заключаются в следующем:
Теперь используйте следующий код:
WebClient client = new WebClient();
string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF");
var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);
Сначала вы должны включить библиотеки как:
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);
}
Преобразовать строку 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);