C # JSON десериализовать в локальные переменные - PullRequest
0 голосов
/ 15 октября 2018

У меня есть что-то вроде этого:

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.

Мысли и идеи о том, как поступить в этом направлении?

Ответы [ 2 ]

0 голосов
/ 17 октября 2018

Вместо использования экземпляра метода «ReadFormatFile» вы можете добавить статический метод «ReadFormatFile» в класс «MyClass_T», который возвращает экземпляр «MyClass_T», возвращаемый из сериализатора.И затем вы могли бы использовать этот метод вместо вызова метода «ReadFormatFile» (или использовать «новый» для создания экземпляра «MyClass_T», который заполняется информацией, которая была ранее сериализована в файл).

Рассмотримследующий класс:

class Demo
{
    public double A;
    public double B;

    public void WriteFormatFile(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 static Demo ReadFormatFile(string filename)
    {


        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;
                return (Demo)serializer.Deserialize(sr, typeof(Demo));
            }
        }
    }
}

и его использование в других местах:

const string filename = "demo.json";
        var d = new Demo();
        d.A = 2;
        d.B = 3;
        d.WriteFormatFile(filename);
        d.A = 4;
        // replace d.ReadFormatFile(filename); with the following line
        d = Demo.ReadFormatFile(filename);
        Console.WriteLine(d.A);

Выход будет «2», восстановленное значение для поля «A».

0 голосов
/ 15 октября 2018

Как многие ясно дали понять, не очень хорошая идея десериализовать объект JSON для локальных переменных, однако, если вы не можете создать класс для объекта, вы можете использовать тип объекта dynamic, это будетпозволяют вам десериализовать JSON в объект, устраняя при этом необходимость добавлять любые строго типизированные модели / классы.

все, что вам нужно сделать, это преобразовать десериализованный результат в dynamic, как и любой другой объект,Например,

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

. Это позволит вам затем получить доступ к myObject, как и к любому другому объекту, например,

myObject.filename.

Я также хотел бы повторить, что вы действительно должны использовать класс для этого, поскольку он делает код намного более предсказуемым, обслуживаемым и чистым в целом

...