Как я могу разбирать JSON с С#?

У меня есть следующий код:

var user = (Dictionary<string, object>)serializer.DeserializeObject(responsecontent);

Входом в responsecontent является JSON, но он не правильно разбирается в объекте. Как правильно десериализировать его?

Ответ 1

Я предполагаю, что вы не используете Json.NET (пакет Newtonsoft.Json NuGet). Если это так, то вы должны попробовать.

Он имеет следующие функции:

  • LINQ to JSON
  • JsonSerializer для быстрого преобразования ваших объектов .NET в JSON и обратно.
  • Json.NET может произвольно создавать хорошо отформатированный отступы JSON для отладки или отображения
  • Атрибуты, такие как JsonIgnore и JsonProperty, могут быть добавлены в класс для настройки того, как класс сериализуется
  • Возможность конвертировать JSON в и из XML
  • Поддержка нескольких платформ:.NET, Silverlight и Compact Framework

Посмотрите на пример ниже. В этом примере класс 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);

Ответ 2

Как здесь было сказано - 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;

Ответ 3

Ниже приведены некоторые параметры без с использованием сторонних библиотек:

// 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());

Ответ 4

Если .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 довольно мило...

Ответ 5

Другим родным решением для этого, которое не требует каких-либо сторонних библиотек, но ссылкой на 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)

Ответ 7

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();
        }
    }
}

Ответ 8

Используйте этот инструмент для генерации класса, основанного на вашем json:

http://json2csharp.com/

А затем используйте класс для десериализации вашего 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

Ответ 9

Попробуйте следующий код:

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();
}

Ответ 10

Следующее из 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 пространство имен.

Ответ 11

Думаю, лучший ответ, который я видел, - @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 и делал мою жизнь очень легкой.

Ответ 12

         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();

Ответ 13

Здесь есть много отличных ответов, но ни один из них не подходит для .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

Ответ 14

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"]);

Ответ 15

 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; } 
 }