在C#中解析Json字符串

时间:2012-10-01 15:54:26

标签: c# json json.net

我正在尝试在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"
        }
    }
]

我想使用像

这样的格式将其解析为arraylist或字典
descriptionList["AppName"] = "Lorem ipsum dolor sit amet";
valueList["AppName"] = "1";

我一直在玩Json.Net,但我见过的例子并没有让我清楚地知道如何做到这一点。实现这一目标的最佳方法是什么?不能像在jQuery中那样使用foreach语句吗?

5 个答案:

答案 0 :(得分:42)

我在我的项目中使用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中创建解决方案或项目更容易。

答案 1 :(得分:19)

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

c#代码:只取一个值,例如单词&#34; bike&#34;。

//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

答案 2 :(得分:15)

您可以尝试使用System.Web.Script.Serialization.JavaScriptSerializer

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

答案 3 :(得分:1)

您也可以使用动态代替arraylist或词典。大多数时候我使用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);

On NuGet:EasyHttp

答案 4 :(得分:1)

您尝试反序列化为Dictionary的实际上是一个序列化为JSON的Javascript对象。在Javascript中,您可以将此对象用作关联数组,但实际上它是一个对象,就JSON标准而言。

因此,您可以将使用标准JSON序列化程序(如.net,DataContractJsonSerializer和JavascriptSerializer)的内容反序列化为对象(具有名为AppName,AnotherAppName等的成员),但实际上将其解释为字典你需要一个比Json规范更远的序列化器,据我所知,它没有关于字典的任何内容。

其中一个例子是每个人都使用的例子: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; }
}