Am urmatorul cod:
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
Intrare în responsecontent` este JSON, dar nu este corect analizat într-un obiect. Cum ar trebui să în mod corespunzător deserialize?
Eu sunt presupunând că nu sunt utiliza Json.NET (Newtonsoft.Json pachete NuGet). Dacă asta e cazul, atunci ar trebui să încercați să-l.
Acesta are următoarele caracteristici:
Uita-te la exemplu de mai jos. În acest exemplu, JsonConvert
clasă este folosit pentru a converti un obiect la și de la JSON. Acesta are două metode statice pentru acest scop. Acestea sunt SerializeObject(Object obj)
și 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);
Cum s-a răspuns aici - Deserialize JSON în C# obiect dinamic?
L's destul de simplu, folosind 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;
Sau folosind 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;
Aici sunt unele opțiuni fără folosind biblioteci terțe:
// 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);
A se vedea link-ul pentru mai multe informații despre Sistem.Web.Ajutoare.Json.
**** Update: în zilele noastre cel mai simplu mod de a obține de pe Web.Ajutoare` este de a utiliza pachete NuGet.
Dacă tu nu't grijă despre versiunile anterioare de windows, puteți utiliza clase de Windows.Date.Json
nume:
// 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());
Dacă .NET 4 este disponibil pentru tine, a verifica afară: http://visitmix.com/writings/the-rise-of-json (archive.org)
Aici este un fragment de pe site-ul:
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);
Ultima Consola.WriteLine este destul de dulce...
O altă soluție nativ pentru acest lucru, care nu't nevoie de biblioteci 3rd party dar o referință la de Sistem.Web.Extensiile este JavaScriptSerializer. Acest lucru nu este nou, dar un necunoscut built-in caracteristici de acolo de 3.5.
using System.Web.Script.Serialization;
..
JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());
și înapoi
MyObject o = serializer.Deserialize<MyObject>(objectString)
Sistem.Json funcționează acum...
Instalați nuget https://www.nuget.org/packages/System.Json
PM> Install-Package System.Json -Version 4.5.0
Exemplu:
// 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();
}
}
}
Utilizați acest instrument pentru a genera o clasa de baza în json:
Și apoi utilizați clasa a deserialize ta json. Exemplu:
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]
Referințe: https://forums.asp.net/t/1992996.aspx?Nested+Json+Deserializarea+a+C+obiect+si+cu+care+obiect https://www.newtonsoft.com/json/help/html/DeserializeObject.htm
Încercați următorul cod:
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();
}
Următoarele din msdn site-ul ar trebui să cred că ajuta oferi o funcționalitate nativ pentru ceea ce sunteți în căutarea pentru. Vă rugăm să rețineți că este specificat pentru Windows 8. Un astfel de exemplu de pe site-ul este listat mai jos.
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");
Se utilizeaza Windows.Date.JSON nume.
Cred ca cel mai bun raspuns pe care nu - 'am văzut a fost @MD_Sayem_Ahmed.
Întrebarea ta este "Cum pot parse Json cu C#", dar se pare ca sunt dorința de a decoda Json. Dacă sunteți în care doresc să-l decodeze, Ahmed's răspunsul este bun.
Dacă sunteți încercarea de a realiza acest lucru în ASP.NET Api Web, cel mai simplu mod este de a crea un transfer de date obiect care conține datele pe care doriți să o atribuiți:
public class MyDto{
public string Name{get; set;}
public string Value{get; set;}
}
Trebuie pur și simplu adăugați application/json antet la cererea dvs. (dacă utilizați Scripcarul, de exemplu). Apoi, va trebui să utilizați acest lucru în ASP.NET Web API, după cum urmează:
//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
}
Acest lucru m-a ajutat foarte mult când am fost de lucru în Web Api și mi-a făcut viața foarte ușor.
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 vine cu de Sistem.Text.Json
built-in, care înseamnă că puteți acum deserialize/serialize JSON fără folosind un al treilea-petrecere de bibliotecă.
Pentru a serializa clasa(clasele) de la JSON string:
var json = JsonSerializer.Serialize(order);
Pentru a deserialize JSON într-un puternic tastat clasa:
var order = JsonSerializer.Deserialize<Order>(json);
Deci, dacă aveți o astfel de clasă de mai jos:
public class Order
{
public int Id { get; set; }
public string OrderNumber { get; set; }
public decimal Balance { get; set; }
public DateTime Opened { get; set; }
}
var json = JsonSerializer.Serialize(order);
// creates JSON ==>
{
"id": 123456,
"orderNumber": "ABC-123-456",
"balance": 9876.54,
"opened": "2019-10-21T23:47:16.85",
};
var order = JsonSerializer.Deserialize<Order>(json);
// ==> creates the above class
Un lucru de remarcat este faptul că Sistemul.Text.Json
nu se ocupa automat camelCase
JSON proprietăți atunci când se utilizează propriul cod (cu toate acestea, nu atunci când se utilizează MVC/WebAPI cereri și modelul de liant).
Deci, dacă aveți JSON ca de mai jos și "Ordinul" ca mai sus, atunci acesta nu va deserialize în clasa ta.
var json = @"{
""id"": 123456,
""orderNumber"": ""ABC-123-456"",
""balance"": 9876.54,
""opened"": ""2019-10-21T23:47:16.8513874+01:00"",
}";
Pentru a rezolva acest lucru aveți nevoie pentru a trece JsonSerializerOptions
ca un parametru (din păcate, l's nu este posibil pentru a configura această aplicație largă).
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);
`Sistemul.Text.Json este, de asemenea, disponibile .Net Framework și .Net Standard ca Nu-pachet Sistem.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; }
}