我试图在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,但我看到的例子并没有让我清楚地知道我应该如何做到这一点。实现这一目标的最佳方式是什么?不能像在jQuery中那样使用foreach语句来完成此操作吗?
我在我的项目中使用Json.net,它工作得很好。在您的情况下,您可以这样做来解析json:
EDIT:我更改了代码,使其支持读取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中创建解决方案或项目更容易。
json:
[{"ew":"vehicles","hws":["car","van","bike","plane","bus"]},{"ew":"countries","hws":["America","India","France","Japan","South Africa"]}]
c#code:只取一个值,例如单词"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
您可以尝试使用System.Web.Script.Serialization.JavaScriptSerializer
:
var json = new JavaScriptSerializer();
var data = json.Deserialize<Dictionary<string, Dictionary<string, string>>[]>(jsonStr);
您也可以使用dynamic来代替arraylist或dictionary。大多数时候,我使用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
您试图反序列化为Dictionary的实际上是一个序列化为JSON的Javascript对象。在Javascript中,您可以将此对象用作关联数组,但就JSON标准而言,它实际上是一个对象。
因此,将标准JSON序列化程序(如.net、DataContractJsonSerializer和JavascriptSerializer)反序列化为对象(具有名为AppName、AnotherAppName等的成员)不会有问题,但要将其实际解释为字典,您需要一个比JSON规范更进一步的序列化程序,据我所知,它没有任何关于词典的内容。
其中一个例子就是每个人都使用的:JSON.net
如果您不想使用外部lib,还有另一种解决方案,即在将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; }
}