C#将两种不同类型的属性序列化为JSON

时间:2018-08-01 17:53:38

标签: c# json class properties

我需要根据用户输入将属性类型设置为字符串或Class TypeClass,以便将其序列化为json。

所以我想得到这个

{"query":"type":"Gold Ring","sort":{"price":"asc"}}

或此json

{"query":"type":{"option":"Gold Ring","cat":"Jewelery"},"sort":{"price":"asc"}}

但是我真的不知道该怎么实现。

[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
public string Type { get; set; }

[JsonProperty("type", NullValueHandling = NullValueHandling.Ignore)]
public TypeClass TypeMap { get; set; }

类型类别:

public partial class TypeClass
{
    [JsonProperty("option", NullValueHandling = NullValueHandling.Ignore)]
    public string Option { get; set; }

    [JsonProperty("cat", NullValueHandling = NullValueHandling.Ignore)]
    public string Cat { get; set; }
}

预先感谢

2 个答案:

答案 0 :(得分:0)

您最好的选择(我还没有测试过这个,所以很有可能在这里我错了)将是测试解析器检索到的值,并对其进行处理。例如,您可以这样做

JObject json = (JObject)JToken.Parse({JSON FILE NAME});

然后执行以下操作:

if(json["query"]["type"].Type == JTokenType.String)
{
    //Do stuff if if you just type a string as a straight up single string 
}
else
{
    //Do stuff you would do if it were a TypeClass value inside of the json
}

您还可以做的只是按照以下方式做些事情:

var json = (JObject)JToken.Parse({JSON FILE NAME});

if(json["query"]["type"].Value().GetType() == typeof(string))
{
     string json = json["query"]["type"];
     //Do string stuff
}
else if (json["query"]["type"].GetType == typeof(TypeClass))
{

 TypeClass json = new TypeClass() { 
     Option = json["query"]["type"]["option"], 
     Cat = json["query"]["type"]["cat"],};

 //Do TypeClass stuff

 }

或者甚至带有模板的东西:

//Method declaration 
static bool IsTypeClass<T>(T value)
{
   Type ParamType = typeof(T);

    if(T.GetType() == "TypeClass")
    {
        //Is a TypeClass object
        return true;
    }
    //Is not a TypeClass Object
    return false;
}

然后在需要比较的地方使用它,如果类型是字符串还是TypeClass。

我希望这会有所帮助!

答案 1 :(得分:0)

将您的JSON示例放入此网站http://json2csharp.com/

{"query":{"type":"Gold Ring"},"sort":{"price":"asc"}}

public class Query
{
    public string type { get; set; }
}

public class Sort
{
    public string price { get; set; }
}

public class RootObject
{
    public Query query { get; set; }
    public Sort sort { get; set; }
}