首页 > 解决方案 > C# JSON 反序列化为局部变量

问题描述

我有这样的事情:

public class MyClass_T
{

    public string filename;
    public string filename_txt;
    public int version = 1;
    public double A;
    public double B;
    ....and so on with about 100 more variables
}

我已将数据写入 JSON 格式的文件

    public bool readFormatFile(string filename)
    {
        JsonSerializer serializer = new JsonSerializer();
        serializer.NullValueHandling = NullValueHandling.Ignore;

        using (FileStream fs = new FileStream(filename, FileMode.Create, System.IO.FileAccess.Write, FileShare.Read))
        {
            using (StreamWriter sw = new StreamWriter(fs))
            {
                using (JsonWriter writer = new JsonTextWriter(sw))
                {
                    serializer.Serialize(writer, this);
                }
            }
        }
     }

现在我想反序列化它。我知道我可以这样做:

    public bool writeFormatFile(string filename)
    {
        MyClass_T MC = new MyClass_T();

        using (FileStream fs = new FileStream(filename, FileMode.Open, System.IO.FileAccess.Read, FileShare.Read))
        {
            using (StreamReader sr = new StreamReader(fs))
            {
                JsonSerializer serializer = new JsonSerializer();
                serializer.NullValueHandling = NullValueHandling.Ignore;
                serializer.MissingMemberHandling = MissingMemberHandling.Ignore;
                MC = (MyClass_T)serializer.Deserialize(sr, typeof(MyClass_T));
            }
        }
     }

请注意,readFormatFile 和 writeFormatFile 是 MyClass_T 的一部分。我需要将值返回到我的局部变量中,而不必做一堆

    filename = MC.filename;
    filename_txt = MC.filename_txt;
    version = MC.version;
    A = MC.A;
    B = MC.B;
    ...and so on for the 100 or so variables.

关于如何进行此操作的想法和想法?

标签: c#jsondeserialization

解决方案


就像很多人已经明确的那样,将 JSON 对象反序列化为局部变量并不是一个好主意,但是如果您不能为对象创建类,则可以使用dynamicobject 类型,这将允许您反序列化 JSON到对象中,同时无需添加任何强类型模型/类。

您需要做的就是将反序列化的结果转换为 a dynamic,就像您将任何其他对象一样,例如

dynamic myObject = (dynamic)serializer.Deserialize(sr, typeof(dynamic));

这将允许您myObject像访问任何其他对象一样访问,例如

myObject.filename例如。

我还想重申一下,您确实应该为此使用一个类,因为它使代码总体上更具可预测性、可维护性和清洁性


推荐阅读