web-dev-qa-db-ja.com

C#でJSON文字列を解析する

私はC#でJson文字列を読み取ろうとしていますが、文字列をC#に解析する方法を理解するのに問題があります。次のJson文字列があるとします

[
    {
        "AppName": {
            "Description": "Lorem ipsum dolor sit amet",
            "Value": "1"
        },
        "AnotherAppName": {
            "Description": "consectetur adipisicing elit",
            "Value": "String"
        },
        "ThirdAppName": {
            "Description": "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua",
            "Value": "Text"
        },
        "Application": {
            "Description": "Ut enim ad minim veniam",
            "Value": "100"
        },
        "LastAppName": {
            "Description": "quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat",
            "Value": "ZZZ"
        }
    }
]

次のような形式を使用して、それを配列リストまたは辞書に解析したい

descriptionList["AppName"] = "Lorem ipsum dolor sit amet";
valueList["AppName"] = "1";

私はJson.Netをいじくり回してきましたが、私が見た例では、これをどのようにすればよいか明確にわかりません。これを達成する最良の方法は何ですか? foreachステートメントを使用して、jQueryのようにこれを行うことはできませんか?

46
desto

私は自分のプロジェクトでJson.netを使用していますが、うまく機能します。あなたの場合、これを実行してjsonを解析できます:

編集:コードを変更して、jsonファイル(配列)の読み取りをサポートするようにしました

解析するコード:

void Main()
{
    var json = System.IO.File.ReadAllText(@"d:\test.json");

    var objects = JArray.Parse(json); // parse as array  
    foreach(JObject root in objects)
    {
        foreach(KeyValuePair<String, JToken> app in root)
        {
            var appName = app.Key;
            var description = (String)app.Value["Description"];
            var value = (String)app.Value["Value"];

            Console.WriteLine(appName);
            Console.WriteLine(description);
            Console.WriteLine(value);
            Console.WriteLine("\n");
        }
    }
}

出力:

AppName
Lorem ipsum dolor sit amet
1


AnotherAppName
consectetur adipisicing elit
String


ThirdAppName
sed do eiusmod tempor incididunt ut labore et dolore magna aliqua
Text


Application
Ut enim ad minim veniam
100


LastAppName
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat
ZZZ

ところで、 LinqPad を使用してコードをテストできます。VisualStudioでソリューションやプロジェクトを作成するよりも簡単です。

43
AZ.
json:
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]

c#コード:単一の値のみを取得します(たとえば、「bike」という単語)。

//res=[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]

         dynamic stuff1 = Newtonsoft.Json.JsonConvert.DeserializeObject(res);
         string Text = stuff1[0].hws[2];
         Console.WriteLine(Text);

出力:

bike
21

System.Web.Script.Serialization.JavaScriptSerializerで試すことができます:

var json = new JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr);
15
Guillaume86

ディクショナリにデシリアライズしようとしているのは、実際にはJSONにシリアライズされたJavascriptオブジェクトです。 Javascriptでは、このオブジェクトを連想配列として使用できますが、実際にはJSON標準に関する限りオブジェクトです。

そのため、標準のJSONシリアライザー(.netのもの、DataContractJsonSerializer、JavascriptSerializerなど)のオブジェクトをオブジェクト(AppName、AnotherAppNameなどと呼ばれるメンバー)に逆シリアル化しても問題ありませんが、実際にはこれを辞書として解釈します。私が知っている限り、辞書については何も持っていないJson仕様よりもさらに進んだシリアライザーが必要です。

そのような例の1つは、誰もが使用するものです。 JSON .net

外部ライブラリを使用したくない場合は、別の解決策があります。これは、JavaScriptオブジェクトをJSONにシリアル化する前にリストに変換することです。

var myList = [];
$.each(myObj, function(key, value) { myList.Push({Key:key, Value:value}) });

myListをJSONオブジェクトにシリアル化すると、前述のシリアライザーのいずれかを使用してList<KeyValuePair<string, ValueDescription>>に逆シリアル化できるようになります。そのリストは、辞書に変換するのは明らかです。

注:このクラスであるValueDescription:

public class ValueDescription
{
    public string Description { get; set; }
    public string Value { get; set; }
}
1

配列リストまたは辞書の代わりに、ダイナミックを使用することもできます。ほとんどの場合、このために EasyHttp を使用しますが、同じことを行う他のプロジェクトが存在することを確認してください。以下の例:

var http = new HttpClient();
http.Request.Accept = HttpContentTypes.ApplicationJson;
var response = http.Get("url");
var body = response.DynamicBody;
Console.WriteLine("Name {0}", body.AppName.Description);
Console.WriteLine("Name {0}", body.AppName.Value);

NuGetの場合: EasyHttp

1
Erwin