0

我需要将 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}"

任何人都可以在这方面提供帮助,我们将不胜感激

4

3 回答 3

2

你可以像这样声明这个类。

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; }
于 2020-06-10T05:37:39.027 回答
1

要读取给定 json 的选项表单,您需要使用Trim和删除额外的引号DeserializeObject

var cType = JsonConvert.DeserializeObject<CType>(testJson);
var options = JsonConvert.DeserializeObject<Dictionary<string, string>>(cType.Options.Trim('"'));
于 2020-06-10T06:27:20.213 回答
1

假设您希望将选项反序列化为字符串而不是字典 - 您需要更改 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
}
}

代码需要将属性更改为 Dictionary

 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; }
}
于 2020-06-10T06:48:28.413 回答