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


455

私は次のコードを持っています:

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

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


7
ねえ、あなたは、このリンクを試してみたいことがありますtechblog.procurios.nl/k/n618/news/view/14605/14863/...
Vamsi

34
ありますJsonSystem.Web.Helpersあります、JsonQueryStringConverterSystem.ServiceModel.Webあります、JavascriptSerializerSystem.Web.Script.SerializationDataContractJsonSerializerSystem.Runtime.Serialization.JsonMSも、第三者を含めることを決定した一体、Json.NETそのASP.NETのWeb APIには。それだけでは不十分だと思った場合は、MSが考え出されてSystem.Jsonいますが、現在は消費に適していません。マイクロソフトへの道のり....私は最高に見える名前空間で選択します。
nawfal

4
@fusi残りは別のアセンブリにあります。名前空間/クラス名をGoogleに指定すると、msdnドキュメントにそれらのアセンブリが見つかります。そのアセンブリへの参照を追加するだけです。
nawfal

1
ただ、完全に、またそこにあるJsonValue中でWindows.Data.Json唯一のWindows 8用の上方にあります。私はそれを愛している。MSはミッションに参加しています:)
naffal

5
NewtonSoftのサイトには比較ページがあります(バイアスがあるかもしれませんが、興味深いものです):newtonsoft.com/json/help/html/jsonnetvsdotnetserializers.htm。私は特にNonsensical辞書のシリアル化の行が好きでした:)
Ohad Schneider

回答:


365

私は、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

以下の例を見てください。この例では、JsonConvertクラスを使用してオブジェクトと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);

18
var目的の完全な構造がわからない場合、型変数に逆シリアル化できますか?具体的には、Rally User Storiesを使用していて、それらをオブジェクトに変換したいと考えています。
ペドロデュッソ2013年

16
@VANDERWEYENJonathan-最新のWebブラウザーでは、JSON.parse(string)とJSON.stringify(object)はどちらもISO8601文字列として日付を処理します。これは上記の回答に示されている形式です。人々がそれが無関係であると決定する前にあなたの標準を更新したいと思うかもしれません。人々は彼らがあなたの標準を必要とするよりもはるかに多くの日付を必要としています。
Peter Wone 2014年

3
@PeterWone:いいえ、日付ではなく文字列をJSON.parse('{"Expiry": "2008-12-28T00:00:00"}').Expiry返します。それができになっ経て、しかし、日付について何も知りません。すべての文字列値をパターンに対してチェックするリバイバーを渡す必要があります。 "2008-12-28T00:00:00"Datenew Date(str)JSON.parse
TJクラウダー2015

3
3.703秒は3秒と703ミリ秒と同じで、セパレータは小数点なので、これは秒から小数点第3位までであると説明しました。
Peter Wone 2015

38
なぜ誰もが関連を含むこのような問題が持っているのrequireincludeimportまたはusingその回答でステートメントを。その1行が痛いですか?
トマーシュZato -復活モニカ

285

ここで答えられたように-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;

13
@MaxHodges、あなたは正しい。JSON文字列値を解析する方法を示すために、インラインの「マジック文字列」を使用しました。二重引用符をエスケープして複雑に見せたくありませんでした。実際のコードでは、JSON文字列は通常、どこかから変数として取得するか、パラメーターとして渡します。
ドミトリーパブロフ2016年

4
.net 4がなければ、「動的」キーワードはありません。宣言には「var stuff」を使用でき、「stuff.Name」と「stuff.Address.City」の代わりに、それぞれ「stuff ["Name"]」と「stuff ["Address"] ["City"]」を使用できます。
2017

1
@Filこれによりtypeの値がobject得られ、でインデックスを使用することはできませんobject
Alex

138

サードパーティのライブラリ使用しないオプションは次のとおりです。

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

ASP.NET Webサイト(4.5)にSystem.Web.Helpersが表示されないのはなぜですか?XElement、XPathSelectElementがVisualStudioで認識されていません。それを教育する方法?
Budda 2014

さて、対応するライブラリへの参照を追加する必要があります(上記のコメントに記載されています)。詳細については、この記事参照してください。また、この質問は興味深いかもしれません。
qqbenq 2014

2
:私はこの記事で解決した問題にWeb.Helpers方法は、ここで説明したが使用RAN stackoverflow.com/questions/7066726/...
アレックス

1
System.Runtime.Serialization.Jsonを使用して次の名前空間を使用し、WPFで動作します。System.Xml.XPathを使用します。System.Xml.Linqを使用します。
Shahid Neermunda 2016

3
Json.Netは、もはやサードパーティのコンポーネントではありません。マイクロソフトは最近、自分で使用しています。これは、Web APIのデフォルトのシリアライザです。
リアム

62

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


申し訳ありませんが、最初に回答してから状況が変わったようです。私は周りを
見回して

7
このライブラリを見つけることを楽しみにしています。編集:これは次のとおりです:dynamicjson.codeplex.com
user989056

1
ElonUクラスの意味がわかりませんが、Windows.Data.Jsonには「JsonValue」があり(Windows 8以降のみ-奇妙です)、System.Jsonにも同じ「JsonValue」があり、プレビューと神だけが出てくるかどうかを知っています。Jsonに関しては、MSは私を混乱させます。
nawfal

35

これに対する別のネイティブソリューションは、サードパーティのライブラリを必要とせず、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)

2
これは非常に便利ですが、Webコンポーネントが必要であるため、残念ながら、Windows XPの最後の.NETバージョンである.NET 4.0クライアントプロファイルでは機能しません。.NETの完全インストールは可能ですが、多くの人はクライアントプロファイルのみを使用します。対照的に、System.Runtime.Serialization.Json.DataContractJsonSerializerは、クライアントプロファイルでもサポートされます。
アルケップ2015

3
@ fr34kyn01535:Windows XPは、デスクトップで2番目に市場シェアが高い。関連性があります。
DonkeyMaster 2015

JavaScriptSerializerを使用してオブジェクトを逆シリアル化すると、機能しましたが、日付が正しく逆シリアル化されませんでした。それは4/19/2018 12:00 AMであったはずですが、4/18/2018 08:00 PMにデシリアライズされました。NewtonSoft.Json.JsonConvertは期待どおりに逆シリアル化しました。
リッチ


16

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

1
Json.NET/Newtonsoft.Json/"Newtson.Json "とSystem.Jsonの古いイテレーションの数え切れないほどの結果が非推奨となって以来、現代のSystem.Jsonを正しく使用する方法の例を見つけようと試みました。これありがとう。
monkey0506

1
これは非常に役立ちました。どうもありがとうございました。
MAK

10

このツールを使用して、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': 'james@example.com',
  'Active': true,
  'CreatedDate': '2013-01-20T00:00:00Z',
  'Roles': [
    'User',
    'Admin'
  ]
}";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);
// james@example.com

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

おかげで、["result" + variable]の部分が欲しかったのは、JSON.NETでは簡単に実行できない変数をここで使用したかったからです。
PHPGuru 2016

この行は何かをしていますか... JavaScriptSerializer js = new JavaScriptSerializer(); 前もって感謝します。
Chris Catignani

9

System.Text.Json

.NET Core 3.0にはSystem.Text.Jsonビルトインが付属しているため、サードパーティのライブラリ使用せずに JSON デシリアライズ/シリアライズできます。

クラスをJSON文字列にシリアル化するには:

var json = JsonSerializer.Serialize(order);

JSONを強く型付けされたクラスに逆シリアル化するには:

var order = JsonSerializer.Deserialize<Order>(json);

したがって、以下のようなクラスがある場合:

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

注意すべきことの1つは、独自のコードを使用する場合、 JSONプロパティを自動的に処理System.Text.Json しないことです。camelCaseこと(ただし、MVC / WebAPIリクエストとモデルバインダー)。

これを解決するにJsonSerializerOptionsは、パラメーターとして渡す必要があります。

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.Jsonは、.Net Frameworkおよび.Net StandardでもNu-getパッケージSystem.Text.Jsonとして利用できます。


1
クラスがない場合はどうなりますか?jsonデータに何が含まれるかを漠然と知っているだけの場合はどうでしょうか?または、キーがまったく存在する場合はどうなりますか?
Cherona

@Cheronaを使用しますJsonDocument.Parse
haldo

5

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


6
いいですが、「サポートされている最小クライアント:Windows 8」
watbywbarif

私はそれがサポートされなくなったと思います、そして今、newtonsoft json dll icouldntがwindows.data.jsonを見つけます
virtouso

3
watbywbarifが指摘したように@virtouso、それは実際よりかなり新しい、しかし、最小限のサポートだのMicrosoft Windowsのみ8内に動作し、
TargetofGravity

4

以下の拡張を使用できます

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

0

私が見た中で最良の答えは@MD_Sayem_Ahmedでした。

あなたの質問は「C#でJsonを解析するにはどうすればよいですか」ですが、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
         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();

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

2
コードのいくつかの行を投稿するだけでなく、ソリューションをよりよく説明します。どのようにすればよい答えを書くことができます
Massimiliano Kraus 2017

System.Webプロジェクトの参照に含めることを忘れないでください。
Ohad Cohen

-3
 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; } 
 }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.