【问题标题】:Deserialize the Json property(Nested Json) as string in C#在 C# 中将 Json 属性(嵌套 Json)反序列化为字符串
【发布时间】:2020-06-10 05:14:40
【问题描述】:

我需要将 json 反序列化为另一个 Json 中可用的字符串。我有如下的 Json 字符串,

string testJson =
   "{
        "AssemblyName":"AssemplyName",
        "ClassName":"AssemplyName.ClassName",
        "Options":"{ "property1":"value1","property2":10}"
   }";

为了反序列化,我有如下类,

public class CType
{
    public string AssemblyName { get; set; }
    public string ClassName { get; set; }
    public string Options { get; set; }
}

所以,我像下面这样反序列化,

CType cType = JsonConvert.DeserializeObject<CType>(testJson);

现在,我希望结果如下所示,

AssemblyName = "AssemplyName"
ClassName = "AssemplyName.ClassName"
Options = "{ "property1":"value1","property2":10}"

如果有人能提供帮助,我们将不胜感激

【问题讨论】:

标签: c# json deserialization jsonconvert


【解决方案1】:

你可以这样声明类。

public class Options
{
    public string property1 { get; set; }
    public string value1 { get; set; }
    public int property2 { get; set; }
}

public class Example
{
    public string AssemblyName { get; set; }
    public string ClassName { get; set; }
    public Options Options { get; set; }
}

然后你可以像这样反序列化和序列化字符串。

string str = "json string";
Example cType = JsonConvert.DeserializeObject<Example>(str);
string json = JsonConvert.SerializeObject(cType.Options);

有效 Json:

{
    "AssemblyName": "AssemplyName",
    "ClassName": "AssemplyName.ClassName",
    "Options": {
        "property1 ": "",
        "value1": "",
        "property2": 10
    }
}

对于动态嵌套 json,您可以将 Options 声明为字典。上面的代码可以工作。

public Dictionary<string, string> Options { get; set; }

【讨论】:

  • 感谢您的回复 vivek。我需要将该选项作为字符串脱轨。因为,options 属性可能会改变。我的意思是,例如,我们可以收到两个属性,有时我们会收到三个。因此,我们无法像上面那样定义类。我不确定我是否正确。但是,这是我的要求。对不起。
  • 好的...谢谢 vivek。我会检查你的想法并让你知道。谢谢。
【解决方案2】:

要读取给定 json 格式的选项,您需要使用 TrimDeserializeObject 删除额外的引号

var cType = JsonConvert.DeserializeObject<CType>(testJson);
var options = JsonConvert.DeserializeObject<Dictionary<string, string>>(cType.Options.Trim('"'));

【讨论】:

    【解决方案3】:

    假设您希望将选项反序列化为字符串而不是字典 - 您需要更改 json 文件并转义如下引号

    {
    "AssemblyName": "AssemplyName",
    "ClassName": "AssemplyName.ClassName",
    "Options": "
    \"property1\":\"value1\",
    \"property2\": 10   
    "
    }
    

    完成现有代码

     class Program
    {
        static void Main(string[] args)
        {
            string testJson = File.ReadAllText(@"D:\test.json");
    
            CType cType = JsonConvert.DeserializeObject<CType>(testJson);
    
        }
    }
    public class CType
    {
        public string AssemblyName { get; set; }
        public string ClassName { get; set; }
        public string Options { get; set; }
    }
    

    但是,如果您想将其添加到另一个类似于 Dictionary 的对象 - json 需要稍作更改,如下所示

    {
    "AssemblyName": "AssemplyName",
    "ClassName": "AssemplyName.ClassName",
    "Options": {
    "property1":"value1",
    "property2": 10
    }
    }
    

    代码需要将属性更改为字典

     class Program
    {
        static void Main(string[] args)
        {
            string testJson = File.ReadAllText(@"D:\test.json");
    
            CType cType = JsonConvert.DeserializeObject<CType>(testJson);
    
        }
    }
    public class CType
    {
        public string AssemblyName { get; set; }
        public string ClassName { get; set; }
        public Dictionary<string,string> Options { get; set; }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 1970-01-01
      • 2013-01-11
      • 2021-04-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多