在 C# 中解析 Json 字符串

Posted

技术标签:

【中文标题】在 C# 中解析 Json 字符串【英文标题】:Parse Json string in C# 【发布时间】:2018-09-18 16:31:25 【问题描述】:

我正在尝试在 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 语句来完成吗?

【问题讨论】:

你能用DynamicJson从Json字符串中准备C#对象吗? 【参考方案1】:

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

【讨论】:

@L.B 你说得对,它很匆忙。更新后的代码现在读取数组。 实际上,第一个解决方案(在编辑之前)对我有用。 哇。我见过的所有示例都使用了 Serialize/Deserialize 函数,而且比这更令人困惑。我当然喜欢 foreach。 一般情况下,可以查看字符串中的第一个字符。如果是“[”,则使用JArray.Parse。如果是“”,则使用JObject.Parse。否则...可能不是有效的 JSON。【参考方案2】:
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

【讨论】:

【参考方案3】:

你可以试试System.Web.Script.Serialization.javascriptSerializer:

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

【讨论】:

在 System.Web.Script.Serialization 中可用 我真的不认为这个序列化程序可以与字典一起使用 它确实,已经使用它编辑:刚刚用@desto json测试了我的代码,工作正常:) 没问题,实际上 JavascriptSeralizer 仍然在 ASP.NET 中用于 WebMethods,所以它的工作效果比大多数人想象的要好 ^^ 您可能需要将引用 System.Web.Extensions 添加到您的项目中才能访问此类。【参考方案4】:

您也可以使用动态的,而不是数组列表或字典。大多数时候,我为此使用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

【讨论】:

【参考方案5】:

您试图反序列化为 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&lt;KeyValuePair&lt;string, ValueDescription&gt;&gt;。该列表将很明显可以转换为字典。

注意:ValueDescription 是这个类:

public class ValueDescription

    public string Description  get; set; 
    public string Value  get; set; 

【讨论】:

以上是关于在 C# 中解析 Json 字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何解析会导致非法 C# 标识符的 JSON 字符串?

解析从 c# 返回的 json 字符串数组

在 C# 中解析 JSON

C# json字符串解析含有双引号

C# 解析JSON格式数据

C# json解析字符串总是多出双引号