Ik heb de volgende code:
var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);
De invoer in responsecontent
is JSON, maar het is niet correct geparseerd in een object. Hoe moet ik het op de juiste manier deserialiseren?
Antwoord 1, autoriteit 100%
Ik neem aan dat je Json.NET(Newtonsoft.Json NuGet-pakket) niet gebruikt. Als dit het geval is, moet u het proberen.
Het heeft de volgende kenmerken:
- LINQ naar JSON
- De JsonSerializer voor het snel converteren van uw .NET-objecten naar JSON en weer terug
- Json.NET kan optioneel goed geformatteerde, ingesprongen JSON produceren voor foutopsporing of weergave
- Kenmerken zoals
JsonIgnore
enJsonProperty
kunnen aan een klasse worden toegevoegd om aan te passen hoe een klasse wordt geserialiseerd - Mogelijkheid om JSON van en naar XML te converteren
- Ondersteunt meerdere platforms: .NET, Silverlight en het Compact Framework
Bekijk het voorbeeldhieronder. In dit voorbeeld wordt de klasse JsonConvert
gebruikt om een object van en naar JSON te converteren. Het heeft hiervoor twee statische methoden. Dit zijn SerializeObject(Object obj)
en 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);
Antwoord 2, autoriteit 80%
Zoals hier is beantwoord – JSON deserialiseren in dynamisch C#-object?
Het is vrij eenvoudig om Json.NET te gebruiken:
dynamic stuff = JsonConvert.DeserializeObject("{ 'Name': 'Jon Smith', 'Address': { 'City': 'New York', 'State': 'NY' }, 'Age': 42 }");
string name = stuff.Name;
string address = stuff.Address.City;
Of met behulp van 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;
Antwoord 3, autoriteit 37%
Hier zijn enkele opties zonderbibliotheken van derden te gebruiken:
// 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);
Zie de link voor meer informatie over system.web.helpers.json .
Update : Tegenwoordig de gemakkelijkste manier om de Web.Helpers
te krijgen, is om de Nuget-pakket .
Als u niet om eerdere Windows-versies geeft, kunt u de klassen van de Windows.Data.Json
namespace:
// 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());
Antwoord 4, Autoriteit 16%
Als .NET 4 is voor u beschikbaar, bekijk dan: http://visitmix.com/writings/the-rise-of-json (Archive.org)
Hier is een fragment vanaf die site:
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);
Die laatste Console.WriteLine is best lief…
Antwoord 5, autoriteit 11%
Een andere native oplossing hiervoor, waarvoor geen bibliotheken van derden nodig zijn, maar een verwijzing naar System.Web.Extensionsis de JavaScriptSerializer. Dit is geen nieuwe, maar een zeer onbekende ingebouwde functie daar sinds 3.5.
using System.Web.Script.Serialization;
..
JavaScriptSerializer serializer = new JavaScriptSerializer();
objectString = serializer.Serialize(new MyObject());
en terug
MyObject o = serializer.Deserialize<MyObject>(objectString)
Antwoord 6, autoriteit 5%
U kunt ook de bekijken DataContractJsonSerializer
Antwoord 7, autoriteit 5%
System.Text.Json
.NET core3.0 wordt geleverd met System.Text.Json
ingebouwd die betekent dat u JSON kunt deserialiseren/serialiseren zondereen bibliotheek van derden te gebruiken.
Om uw klasse(n) te serialiseren naar JSON-tekenreeks:
var json = JsonSerializer.Serialize(order);
Om de JSON te deserialiseren in een sterk getypeerde klasse:
var order = JsonSerializer.Deserialize<Order>(json);
Dus als je een les hebt zoals hieronder:
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
Een ding om op te merken is dat System.Text.Json
nietautomatisch camelCase
JSON-eigenschappen verwerkt wanneer je je eigen code gebruikt (maar wel bij gebruik van MVC/WebAPI-verzoeken en de modelbinder).
Om dit op te lossen, moet u JsonSerializerOptions
als parameter doorgeven.
JsonSerializerOptions options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase, // set camelCase
WriteIndented = true // write pretty json
};
// pass options to serializer
var json = JsonSerializer.Serialize(order, options);
// pass options to deserializer
var order = JsonSerializer.Deserialize<Order>(json, options);
System.Text.Jsonis ook beschikbaar voor .Net Framework en .Net Standard als een Nu-get-pakket System.Text.Json
Antwoord 8, autoriteit 4%
System.Json werkt nu…
Installeer nuget https://www.nuget.org/packages/System.Json
PM> Install-Package System.Json -Version 4.5.0
Voorbeeld:
// 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();
}
}
}
Antwoord 9, autoriteit 3%
Gebruik deze tool om een klasse te genereren op basis van uw json:
En gebruik dan de klasse om je json te deserialiseren. Voorbeeld:
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]
Referenties:
https: / /forums.asp.net/t/1992996.aspx?nested+Json+Deserialization+to+c+Object+and+ing+that+Object
https://www.newtonsoft.com/json/help/html/desializeObject.htm
Antwoord 10, Autoriteit 2%
Probeer de volgende code:
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();
}
Antwoord 11
Als JSON dynamisch is zoals hieronder
{
"Items": [{
"Name": "Apple",
"Price": 12.3
},
{
"Name": "Grape",
"Price": 3.21
}
],
"Date": "21/11/2010"
}
Zodra u NewtonSoft.Json
van NuGet installeert en in uw project opneemt, kunt u het serialiseren als
string jsonString = "{\"Items\": [{\"Name\": \"Apple\",\"Price\": 12.3},{\"Name\": \"Grape\",\"Price\": 3.21}],\"Date\": \"21/11/2010\"}";
dynamic DynamicData = JsonConvert.DeserializeObject(jsonString);
Console.WriteLine( DynamicData.Date); // "21/11/2010"
Console.WriteLine(DynamicData.Items.Count); // 2
Console.WriteLine(DynamicData.Items[0].Name); // "Apple"
Bron: Hoe JSON-gegevens in C# te lezen (voorbeeld met Console-app & ASP.NET MVC)?
Antwoord 12
Het volgende van de msdn-site moet ik denken dat het helpt om wat native functionaliteit te bieden voor wat u zoekt. Let op: het is gespecificeerd voor Windows 8. Een voorbeeld van zo’n site staat hieronder vermeld.
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");
Het maakt gebruik van de Windows.Data .JSONnaamruimte.
Antwoord 13
U kunt de volgende extensies gebruiken
public static class JsonExtensions
{
public static T ToObject<T>(this string jsonText)
{
return JsonConvert.DeserializeObject<T>(jsonText);
}
public static string ToJson<T>(this T obj)
{
return JsonConvert.SerializeObject(obj);
}
}
Antwoord 14
Ik denk dat het beste antwoord dat ik heb gezien @MD_SAYEM_AHMED.
Uw vraag is “Hoe kan ik json parseren met C #”, maar het lijkt erop dat u JSON wilt decoderen. Als je het wilt decoderen, is het antwoord van Ahmed goed.
Als u dit probeert te bereiken in ASP.NET Web API, is de eenvoudigste manier om een gegevensoverdrachtsobject te maken dat de gegevens die u wilt toewijzen:
public class MyDto{
public string Name{get; set;}
public string Value{get; set;}
}
U hebt eenvoudig de applicatie / JSON-header aan uw verzoek toegevoegd (als u bijvoorbeeld Fiddler gebruikt).
Gebruik dit dan in ASP.NET Web API als volgt:
//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
}
Dit hielp me veel toen ik in mijn web-api werkte en mijn leven super eenvoudig maakte.
Antwoord 15
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();
Antwoord 16
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"]);
Antwoord 17
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; }
}