在Newtonsoft C#中处理多态值

时间:2018-06-20 14:19:11

标签: c# json json.net

好吧,基本上我有一个我不知道可以解决的问题(可能只是设计不好。但不是我这边,如果可能的话,我宁愿自己解决)。

我正在使用的服务正在接受字典作为JSON参数,字典中的键是字符串,但值可以是数字或字符串:

"dictionary":{
    "a": "thisIsA",
    "b":  3,
    "c":  5,
   "key":  "string"
}

我需要创建一个对象,以便在使用newtonsoft将其转换为JSON时,其生成的内容与上述相同

string json = JsonConvert.Serialize(myObject); // here should generate the correct json

3 个答案:

答案 0 :(得分:4)

只需Dictionary<string, object>即可:

using System;
using System.Collections.Generic;
using Newtonsoft.Json;

class Test
{
    static void Main()
    {
        var dictionary = new Dictionary<string, object>
        {
            { "a", "thisIsA" },
            { "b", 3 },
            { "c", 5 },
            { "key", "string" }
        };
        var json = JsonConvert.SerializeObject(dictionary, Formatting.Indented);
        Console.WriteLine(json);
    }
}

输出:

{
  "a": "thisIsA",
  "b": 3,
  "c": 5,
  "key": "string"
}

缺少"dictionary":部分,在序列化对象时您永远都不会获得“裸”格式。但是,如果通过合适的属性将此对象作为另一个对象的一部分,它应该可以满足您的需求。

答案 1 :(得分:2)

我知道生成json的唯一方法是在具有字典属性的字典周围创建包装器类。像这样的东西。

public class MyDictionary
{
    public Dictionary<string,object> Dictionary{get;}

    public MyDictionary()
    {
        Dictionary = new Dictionary<string,object>();
    }

    public void Add(string key, object value){
        Dictionary.Add(key,value);
    }
}

那么您可以像这样使用它

var dictionary = new MyDictionary();
dictionary.Add("a", "thisIsA");
dictionary.Add("b", 3);
dictionary.Add("c", 5);
dictionary.Add("key", "string");

,它应该序列化为

"dictionary":{
    "a": "thisIsA",
    "b":  3,
    "c":  5,
   "key":  "string"
}

答案 2 :(得分:1)

您在问题中包含的JSON实际上不是有效的JSON。可以通过将其包含在{ }中来使其有效。从您的问题尚不清楚,但是如果您想要 valid JSON结果,最简单的方法是在序列化时使用Dictionary<string, object>和匿名对象:

var dictionary = new Dictionary<string, object>
{
    { "a", "thisIsA" },
    { "b", 3 },
    { "c", 5 },
    { "key", "string" }
};
string json = JsonConvert.SerializeObject(new { dictionary });

无论您用什么名字命名Dictionary<string, object>变量,它都是出现在json中的“键”。所以我上面的代码将导致此json:

{
    "dictionary":{
        "a": "thisIsA",
        "b":  3,
        "c":  5,
        "key":  "string"
    }
}

提琴here