【问题标题】:Naming an Object with variable content to serialize in json file命名具有可变内容的对象以在 json 文件中序列化
【发布时间】:2019-04-19 14:22:03
【问题描述】:

我正在尝试将对象序列化为 JSON 文件,但问题是我想给 JSON 对象一个可变的内容名称。

我想我可以做这样的事情:

string codfis = "Example1";

var jsonCF = new {
    codfis = new { // codfis is the name of the variable as you can see
        Cognome = vcgm,
        Nome = vnm,
        Sesso = ss,
        LuogoDiNascita = ldn,
        Provincia = pr,
        DataDiNascita = ddn
    }
};
using (StreamWriter file = File.CreateText("CodFisCalcolati.json")) {
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(file, jsonCF);
}

但显然这并没有达到我想要的效果:

{
    "codfis": { // it named the json object like this, and not "Example1" like above
        "Cognome": "Yoyo",
        "Nome": "OK!",
        "Sesso": "Nice",
        "LuogoDiNascita": "Good",
        "Provincia": "Perfect",
        "DataDiNascita": "Fine"
    }
}

我也试过这个:

string codfis = "Example1";

var jsonCF = new {
    [codfis] = new { // putting brackets on the variable
        Cognome = vcgm,
        Nome = vnm,
        Sesso = ss,
        LuogoDiNascita = ldn,
        Provincia = pr,
        DataDiNascita = ddn
    }
};

但它给了我一个语法错误。

所以我只想做这个......

{
    "Example1": {
        "Cognome": "Yoyo",
        "Nome": "OK!",
        "Sesso": "Nice",
        "LuogoDiNascita": "Good",
        "Provincia": "Perfect",
        "DataDiNascita": "Fine"
    }
}

我该怎么做?

【问题讨论】:

  • 使用字典,而不是匿名对象。
  • 您在一个名为 jsonCF 的已初始化对象中初始化了一个名为 codfis 的对象。它不会将其视为变量并尝试获取其值,这并不奇怪。编辑:也许在创建对象后,您应该尝试访问 codfis key 并将其名称更改为 codfis 变量的值。
  • @DanielA.White 你能解释一下吗?例如,我总是使用字典来获取字符的整数...
  • @FotisPapadamis 等等,我明白了一半,你能用一些代码解释一下吗?
  • @zAlweNy26 使用您想要的键值对创建一个字典。现在要克服错误的codfis 键看看here

标签: c# json.net


【解决方案1】:

与cmets中提到的其他OPS一样,创建字典并序列化它

string codfis = "Example1";
var codfisValue = new
{ // codfis is the name of the variable as you can see
    Cognome = "vcgm",
    Nome = "vnm",
    Sesso = "ss",
    LuogoDiNascita = "ldn",
    Provincia = "pr",
    DataDiNascita = "ddn"
};
var jsonCF = new Dictionary<string, object>();
jsonCF.Add(codfis, codfisValue);


using (StreamWriter file = File.CreateText("CodFisCalcolati.json"))
{
    JsonSerializer serializer = new JsonSerializer();
    serializer.Serialize(file, jsonCF);
}

【讨论】:

    【解决方案2】:

    除了 this 是匿名对象之外,这实际上是正确序列化的。在 jsonCF 对象之外初始化的 codfi 对象永远不会被使用。您实际上是在创建一个全新的对象来表示对象内部的属性。

    “解决方案”取决于您想对这个序列化项目做什么。如果这是您所追求的,您只需要引用您现有的变量而不是创建一个新变量。或者,如果您只想将该属性的名称设为 Example1,只需将其设置为:

        var jsonCF = new {
        Example1 = new { //Note the property name
            Cognome = vcgm,
            Nome = vnm,
            Sesso = ss,
            LuogoDiNascita = ldn,
            Provincia = pr,
            DataDiNascita = ddn
        }
    };
    

    或者,

    var codfis = new {
            Cognome = vcgm,
            Nome = vnm,
            Sesso = ss,
            LuogoDiNascita = ldn,
            Provincia = pr,
            DataDiNascita = ddn
        };
    
    var jsonConf = new {
    
         Example1 = codfis
    }
    
    

    如果您希望属性名称和值都不同,您可能会使用字典而不是这样

    
    var codfisName = "Example1";
    var jsonConf = new Dictionary<string, object>{
    
         {codfisName, codfis}
    };
    
    

    【讨论】:

    • 正如我在问题中所写,我想用变量“codfis”的内容创建一个 json 对象,那么引用它是什么意思?
    • 你的“codfis”对象只是一个字符串,上面写着“example 1”,如果你想使用那个变量,把它变成一个像你的“Example1”这样的对象。然后,在 jsonCF 中引用它。但是,如果您希望属性名称为“Example1”,则必须更改为该名称。
    • 但我把它放在一个变量中,因为它可以变化,它可以变成“Example2”、“Example3”、ecc...
    • 你的变量所在的属性名称不会改变。变量的名称总是相同的。所以现在你的“codfis”属性中有一个全新的对象。那讲得通。但是,您在该对象之外的变量实际上只是一个字符串,上面写着“Example1”并且没有在任何地方使用。
    • 我的意思是,变量的内容会有所不同
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 2016-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多