web-dev-qa-db-ja.com

JSONをC#で解析するにはどうすればよいですか。

次のようなコードがあります。

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

responsecontentの入力はJSONですが、オブジェクトに正しく解析されていません。どのようにして正しくシリアル化解除するのですか?

380
user605334

Json.NET (Newtonsoft.Json NuGetパッケージ)を使用していないと仮定しています。これが事実である場合、それからそれを試みるべきです。

次のような特徴があります。

  1. LINQ to JSON
  2. .NETオブジェクトを素早くJSONに変換したり、またその逆に変換するためのJsonSerializer
  3. Json.NETはデバッグや表示のためにオプションで適切にフォーマットされたインデント付きのJSONを生成することができます。
  4. JsonIgnoreやJsonPropertyなどの属性をクラスに追加して、クラスのシリアル化方法をカスタマイズできます。
  5. JSONとXMLの間の変換
  6. .NET、Silverlight、Compact Frameworkなどの複数のプラットフォームをサポート

以下の example を見てください。この例では、 JsonConvert classはJSONとの間でオブジェクトを変換するために使用されます。この目的のために2つの静的メソッドがあります。それらは 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);
328
MD Sayem Ahmed

ここで答えたように - JSONをC#動的オブジェクトにデシリアライズする?

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;
241
Dmitry Pavlov

これはサードパーティのライブラリを使ういくつかのオプションwithoutです:

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

.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はかなり甘いです...

56
ElonU Webdev

これに対するもう1つのネイティブソリューション、サードパーティ製のライブラリを必要としないが 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)
30
fr34kyn01535

DataContractJsonSerializer をご覧ください。

18

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

msdn サイトからの以下は、あなたが探しているもののためにいくつかのネイティブ機能を提供するのを手伝うと思うべきです。それがWindows 8のために指定されることに注意してください。サイトからのそのような1つの例が以下にリストされています。

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 名前空間を利用します。

3
TargetofGravity

このツールを使用して、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+objecthttps://www.newtonsoft .com/json/help/html/DeserializeObject.htm

2
Bruno Pereira

次のコードを試してください。

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();
}
2
Muhammad Awais
         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();
 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; } 
 }
0
Kobie Williams
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"]);
0
Jidheesh Rajan

私が見た中で最も良い答えは@ MD_Sayem_Ahmedであったと思います。

あなたの質問は「どうやったらJsonをC#でパースできるの?」ですが、Jsonをデコードしたいようです。あなたがそれを解読したいのなら、アーメドの答えは良いです。

ASP.NET Web Apiでこれを実現しようとしている場合、最も簡単な方法は、割り当てたいデータを保持するデータ転送オブジェクトを作成することです。

public class MyDto{
    public string Name{get; set;}
    public string Value{get; set;}
}

リクエストにapplication/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
}

私がWeb Apiで働いていて、私の人生を非常に簡単にしてくれたとき、これは私を大いに助けました。

0
cloudstrifebro