У меня есть следующий код:
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
Входом в responsecontent является JSON, но он не правильно разбирается в объекте. Как правильно десериализировать его?
У меня есть следующий код:
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
Входом в responsecontent является JSON, но он не правильно разбирается в объекте. Как правильно десериализировать его?
Я предполагаю, что вы не используете Json.NET (пакет Newtonsoft.Json NuGet). Если это так, то вы должны попробовать.
Он имеет следующие функции:
Посмотрите на пример ниже. В этом примере класс JsonConvert используется для преобразования объекта в JSON и из него. Для этого у него есть два статических метода. Они SerializeObject(Object obj) и DeserializeObject<T>(String json):
Product product = new Product();
product.Name = "Apple";
product.Expiry = new DateTime(2008, 12, 28);
product.Price = 3.99M;
product.Sizes = new string[] { "Small", "Medium", "Large" };
string json = JsonConvert.SerializeObject(product);
//{
// "Name": "Apple",
// "Expiry": "2008-12-28T00:00:00",
// "Price": 3.99,
// "Sizes": [
// "Small",
// "Medium",
// "Large"
// ]
//}
Product deserializedProduct = JsonConvert.DeserializeObject<Product>(json);
Как здесь было сказано - Deserialize JSON в динамический объект С#?
Это довольно просто, используя Json.NET:
dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;
Или используя Newtonsoft.Json.Linq:
dynamic stuff = JObject.Parse("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;
Ниже приведены некоторые параметры без с использованием сторонних библиотек:
// For that you will need to add reference to System.Runtime.Serialization
var jsonReader = JsonReaderWriterFactory.CreateJsonReader(Encoding.UTF8.GetBytes(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }"), new System.Xml.XmlDictionaryReaderQuotas());
// For that you will need to add reference to System.Xml and System.Xml.Linq
var root = XElement.Load(jsonReader);
Console.WriteLine(root.XPathSelectElement("//Name").Value);
Console.WriteLine(root.XPathSelectElement("//Address/State").Value);
// For that you will need to add reference to System.Web.Helpers
dynamic json = System.Web.Helpers.Json.Decode(@"{ ""Name"": ""Jon Smith"", ""Address"": { ""City"": ""New York"", ""State"": ""NY"" }, ""Age"": 42 }");
Console.WriteLine(json.Name);
Console.WriteLine(json.Address.State);
Подробнее см. ссылку System.Web.Helpers.Json.
Обновление. В настоящее время самым простым способом получить Web.Helpers является использование пакета NuGet.
Если вам не нравятся более ранние версии Windows, вы можете использовать классы пространства имен Windows.Data.Json:
// minimum supported version: Win 8
JsonObject root = Windows.Data.Json.JsonValue.Parse(jsonString).GetObject();
Console.WriteLine(root["Name"].GetString());
Console.WriteLine(root["Address"].GetObject()["State"].GetString());
Если .NET 4 доступен для вас, ознакомьтесь с: http://visitmix.com/writings/the-rise-of-json (archive.org)
Вот фрагмент с этого сайта:
WebClient webClient = new WebClient();
dynamic result = JsonValue.Parse(webClient.DownloadString("https://api.foursquare.com/v2/users/self?oauth_token=XXXXXXX"));
Console.WriteLine(result.response.user.firstName);
Это последнее Console.WriteLine довольно мило...
Другим родным решением для этого, которое не требует каких-либо сторонних библиотек, но ссылкой на System.Web.Extensions, является JavaScriptSerializer. Это не новые, но очень неизвестные встроенные функции с 3,5.
using System.Web.Script.Serialization;
..
JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());
и назад
MyObject o = serializer.Deserialize<MyObject>(objectString)
Вы также можете посмотреть DataContractJsonSerializer
System.Json работает сейчас...
Установить nuget https://www.nuget.org/packages/System.Json
PM> Install-Package System.Json -Version 4.5.0
Образец:
// PM>Install-Package System.Json -Version 4.5.0
using System;
using System.Json;
namespace NetCoreTestConsoleApp
{
class Program
{
static void Main(string[] args)
{
// Note that JSON keys are case sensitive, a is not same as A.
// JSON Sample
string jsonString = "{\"a\": 1,\"b\": \"string value\",\"c\":[{\"Value\": 1}, {\"Value\": 2,\"SubObject\":[{\"SubValue\":3}]}]}";
// You can use the following line in a beautifier/JSON formatted for better view
// {"a": 1,"b": "string value","c":[{"Value": 1}, {"Value": 2,"SubObject":[{"SubValue":3}]}]}
/* Formatted jsonString for viewing purposes:
{
"a":1,
"b":"string value",
"c":[
{
"Value":1
},
{
"Value":2,
"SubObject":[
{
"SubValue":3
}
]
}
]
}
*/
// Verify your JSON if you get any errors here
JsonValue json = JsonValue.Parse(jsonString);
// int test
if (json.ContainsKey("a"))
{
int a = json["a"]; // type already set to int
Console.WriteLine("json[\"a\"]" + " = " + a);
}
// string test
if (json.ContainsKey("b"))
{
string b = json["b"]; // type already set to string
Console.WriteLine("json[\"b\"]" + " = " + b);
}
// object array test
if (json.ContainsKey("c") && json["c"].JsonType == JsonType.Array)
{
// foreach loop test
foreach (JsonValue j in json["c"])
{
Console.WriteLine("j[\"Value\"]" + " = " + j["Value"].ToString());
}
// multi level key test
Console.WriteLine("json[\"c\"][0][\"Value\"]" + " = " + json["c"][0]["Value"].ToString());
Console.WriteLine("json[\"c\"][0][\"Value\"]" + " = " + json["c"][1]["Value"].ToString());
Console.WriteLine("json[\"c\"][1][\"SubObject\"][0][\"SubValue\"]" + " = " + json["c"][1]["SubObject"][0]["SubValue"].ToString());
}
Console.WriteLine();
Console.Write("Press any key to exit.");
Console.ReadKey();
}
}
}
Используйте этот инструмент для генерации класса, основанного на вашем json:
А затем используйте класс для десериализации вашего JSON. Пример:
public class Account
{
public string Email { get; set; }
public bool Active { get; set; }
public DateTime CreatedDate { get; set; }
public IList<string> Roles { get; set; }
}
string json = @"{
'Email': '[email protected]',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin'
]
}";
Account account = JsonConvert.DeserializeObject<Account>(json);
Console.WriteLine(account.Email);
// [email protected]
Ссылки: https://forums.asp.net/t/1992996.aspx?Nested+Json+Deserialization+to+C+object+and+using+that+object https://www.newtonsoft.com/json/help/html/DeserializeObject.htm
Попробуйте следующий код:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("URL");
JArray array = new JArray();
using (var twitpicResponse = (HttpWebResponse)request.GetResponse())
using (var reader = new StreamReader(twitpicResponse.GetResponseStream()))
{
JavaScriptSerializer js = new JavaScriptSerializer();
var objText = reader.ReadToEnd();
JObject joResponse = JObject.Parse(objText);
JObject result = (JObject)joResponse["result"];
array = (JArray)result["Detail"];
string statu = array[0]["dlrStat"].ToString();
}
Следующее из msdn сайта, я думаю, что помощь предоставляет некоторые собственные функции для того, что вы ищете. Обратите внимание, что он указан для Windows 8. Ниже приведен один такой пример с сайта.
JsonValue jsonValue = JsonValue.Parse("{\"Width\": 800, \"Height\": 600, \"Title\": \"View from 15th Floor\", \"IDs\": [116, 943, 234, 38793]}");
double width = jsonValue.GetObject().GetNamedNumber("Width");
double height = jsonValue.GetObject().GetNamedNumber("Height");
string title = jsonValue.GetObject().GetNamedString("Title");
JsonArray ids = jsonValue.GetObject().GetNamedArray("IDs");
В нем используется Windows.Data.JSON пространство имен.
Думаю, лучший ответ, который я видел, - @MD_Sayem_Ahmed.
Ваш вопрос: "Как я могу разобрать Json с С#", но похоже, что вы хотите декодировать Json. Если вы хотите его декодировать, ответ Ахмеда хорош.
Если вы пытаетесь выполнить это в ASP.NET Web Api, самым простым способом является создание объекта передачи данных, который содержит данные, которые вы хотите назначить:
public class MyDto{
public string Name{get; set;}
public string Value{get; set;}
}
Вы просто добавили заголовок приложения /json к вашему запросу (например, если вы используете Fiddler). Затем вы использовали бы это в ASP.NET Web API следующим образом:
//controller method -- assuming you want to post and return data
public MyDto Post([FromBody] MyDto myDto){
MyDto someDto = myDto;
/*ASP.NET automatically converts the data for you into this object
if you post a json object as follows:
{
"Name": "SomeName",
"Value": "SomeValue"
}
*/
//do some stuff
}
Это очень помогло мне, когда я работал в своем веб-Api и делал мою жизнь очень легкой.
string json = @"{
'Name': 'Wide Web',
'Url': 'www.wideweb.com.br'}";
JavaScriptSerializer jsonSerializer = new JavaScriptSerializer();
dynamic j = jsonSerializer.Deserialize<dynamic>(json);
string name = j["Name"].ToString();
string url = j["Url"].ToString();
Здесь есть много отличных ответов, но ни один из них не подходит для .net core 3.0.
.net core 3.0 теперь поставляется со встроенным System.Text.Json, что означает, что теперь вы можете десериализовать/сериализовать JSON без использования сторонней библиотеки. Допустим, у вас есть следующий класс:
public class Order
{
public int Id { get; set; }
public string OrderNumber { get; set; }
public decimal Balance { get; set; }
public DateTime Opened { get; set; }
public bool IsActive { get; set; }
public List<string> Items { get; set; }
}
Затем вы можете легко сериализовать его в JSON:
var json = JsonSerializer.Serialize(order);
Чтобы десериализовать ваш JSON в объект, вы можете сделать наоборот:
var order = JsonSerializer.Deserialize<Order>(json);
Следует отметить, что System.Text.Json не автоматически обрабатывает camelCase свойства JSON при использовании собственного кода (однако это происходит при использовании запросов MVC/WebAPI и связывателя модели).
Поэтому, если у вас есть JSON, как показано ниже, и Order, как и выше, он не будет десериализован в ваш класс.
var json = @"{
""id"": 123456,
""orderNumber"": ""ABC-123-456"",
""balance"": 9876.54,
""opened"": ""2019-10-21T23:47:16.8513874+01:00"",
""isActive"": true,
""items"": [ ""Item1"", ""Item2"", ""Item3"" ]
}";
Чтобы решить эту проблему, вам нужно передать JsonSerializerOptions в качестве параметра (к сожалению, невозможно настроить это приложение в целом).
JsonSerializerOptions options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // set camelCase
WriteIndented = true // write pretty json
};
// serialize using options
var json = JsonSerializer.Serialize(order, options);
// deserialize using options
var order = JsonSerializer.Deserialize<Order>(json, options);
System.Text.Json также доступен для .Net Framework в виде пакета Nu-get System.Text.Json
var result = controller.ActioName(objParams);
IDictionary<string, object> data = (IDictionary<string, object>)new System.Web.Routing.RouteValueDictionary(result.Data);
Assert.AreEqual("Table already exists.", data["Message"]);
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(user)))
{
// Deserialization from JSON
DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(UserListing))
DataContractJsonSerializer(typeof(UserListing));
UserListing response = (UserListing)deserializer.ReadObject(ms);
}
public class UserListing
{
public List<UserList> users { get; set; }
}
public class UserList
{
public string FirstName { get; set; }
public string LastName { get; set; }
}