C# 对json字符串转换操作

一, 方法1
Json.net实现方便的Json转C#(dynamic动态类型)对象
以前需要将一段json字符串转换为C#对象时,一般都是定义一个与之对应的实体类来接收。这样做有一个很大的缺点,就是当字符串特别长,属性特别多,又有嵌套时,手敲这个实体类就非常痛苦。

C# 4.0 之后有了动态类型dynamic。用这个东西配合Json.net可以实现不用定义实体类的json转dynamic类型对象。
以下示例需要先引用Newtonsoft.Json.dll

public class Person {
    public int Id { get; set; }
    public string Name { get; set; }
} 
class Program
{
    static void Main(string[] args)
    {
        Person p = new Person();
        p.Id = 1;
        p.Name = "刘备";
        //C#对象转Json
        string json = JsonConvert.SerializeObject(p);
        Console.WriteLine(json);    //{"Id":1,"Name":"刘备"}
         
        //此处模拟在不建实体类的情况下,反转将json返回dynamic对象
        var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
        Console.WriteLine(DynamicObject.Name);  //刘备
        Console.ReadKey();
    }
}

以上只是借用了一个实体类来获得一个简单的JSON对象。
实际上,可以完全没有这个Person类。

static void Main(string[] args)
{
    string json = "{\"Id\":1,\"Name\":\"刘备\",\"Age\":\"22\"}";
    //此处模拟在不建实体类的情况下,反转将json返回回dynamic对象
    var DynamicObject = JsonConvert.DeserializeObject<dynamic>(json);
    Console.WriteLine(DynamicObject.Name);  //刘备
    Console.ReadKey();
}

如果未引用Microsoft.CSharp.dll,关于动态类型,VS可能会报错。
VS 可以回编译报错:找不到编译动态表达式所需的一个或多个类型。是否缺少引用?

二, 方法2
利用System.Web.Helpers, 注:需要引入 System.Web.Helpers.dll. 例子:

 1. 参数:jsonStr
{
    "log_id": 620759800,
    "words_result": [
        {
            "location": {
                "left": 56,
                "top": 0,
                "width": 21,
                "height": 210
            },
            "words": "3"
        }
    ],
    "words_result_num": 1
}

2.函数  //use linq to get the max number from the return json format string   
        public string GetMaxNumber(string jsonStr)
        {
            try
            {
                dynamic data = System.Web.Helpers.Json.Decode(jsonStr);//convert json string to dynamic object. need add reference of "System.Web.Helpers.dll" , 对应的是 Json.Encode()

                var result = (from i in (IEnumerable<dynamic>)data.words_result
                              select new
                              {
                                  num = int.Parse(i.words)
                              }).Max(c => c.num);
                return Convert.ToString(result);
            }
            catch (Exception e)
            {
                return "";
            }
        }

三.方法3
JavaScriptSerializer.Serialize 方法
定義
命名空間:
System.Web.Script.Serialization
組件:
System.Web.Extensions.dll
適用於
.NET Framework 4.8 及其他版本
参考:
https://docs.microsoft.com/zh-tw/dotnet/api/system.web.script.serialization?view=netframework-4.8

using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.Script.Serialization;

namespace ExampleApplication
{
    public partial class _Default : Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            var RegisteredUsers = new List<Person>();
            RegisteredUsers.Add(new Person() { PersonID = 1, Name = "Bryon Hetrick", Registered = true });
            RegisteredUsers.Add(new Person() { PersonID = 2, Name = "Nicole Wilcox", Registered = true });
            RegisteredUsers.Add(new Person() { PersonID = 3, Name = "Adrian Martinson", Registered = false });
            RegisteredUsers.Add(new Person() { PersonID = 4, Name = "Nora Osborn", Registered = false });

            var serializer = new JavaScriptSerializer();
            var serializedResult = serializer.Serialize(RegisteredUsers);
            // Produces string value of:
            // [
            //     {"PersonID":1,"Name":"Bryon Hetrick","Registered":true},
            //     {"PersonID":2,"Name":"Nicole Wilcox","Registered":true},
            //     {"PersonID":3,"Name":"Adrian Martinson","Registered":false},
            //     {"PersonID":4,"Name":"Nora Osborn","Registered":false}
            // ]

            var deserializedResult = serializer.Deserialize<List<Person>>(serializedResult);
            // Produces List with 4 Person objects
        }
    }
 public class Person
    {
        public int PersonID { get; set; }
        public string Name { get; set; }
        public bool Registered { get; set; }
    }

}

你可能感兴趣的:(Linq,c#)