59

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のようにこれを行うことはできませんか?

4

5 に答える 5

55

プロジェクトで 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を使用してコードをテストできます。Visual Studio でソリューションやプロジェクトを作成するよりも簡単だと思います。

于 2012-10-01T16:25:52.263 に答える
33
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
于 2015-11-19T09:54:51.980 に答える
17

あなたが試すことができますSystem.Web.Script.Serialization.JavaScriptSerializer

var json = new JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr);
于 2012-10-01T15:57:22.820 に答える
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

于 2012-10-01T15:58:47.780 に答える
1

Dictionary に逆シリアル化しようとしているのは、実際には 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}) });

List<KeyValuePair<string, ValueDescription>>myList を JSON オブジェクトにシリアライズすると、前述のシリアライザのいずれかを使用してデシリアライズできるはずです。そのリストは、辞書に変換するのが非常に明白です。

注: ValueDescription はこのクラスです:

public class ValueDescription
{
    public string Description { get; set; }
    public string Value { get; set; }
}
于 2012-10-01T16:12:39.580 に答える