0

我正在尝试创建一个类库,它允许我从列表中读取数据,然后以 json 格式输出数据。下面是客户希望我模拟的 json 屏幕截图。我相信想使用 json.net 库来创建这个 json 文件,但我正在努力如何创建我的 c# 类和集合以获得下面指定的输出。

顶层对象应该是 OEM 对象,所以我希望在您看到“7”、“8”、“27”、“49”、“16”的地方看到“OEM”。

例如,如果我的 OEM 类看起来像:

public class OEM
{
    public int OemID { get; set; }

}

创建json的代码是:

List<asbs.OEM> Oems = new List<asbs.OEM>();
   asbs.OEM oem = new asbs.OEM() { OemID = 7 };
   Oems.Add(oem);

   string json = JsonConvert.SerializeObject(Oems, Formatting.Indented);
   this._txt_Output.Text = json;

输出是这样的:

[
  {
    "OemID": 7
  }
]

如何让对象命名为“7”而不是 OemId?这是可能的还是 json 文件不利于通过使用像我的 OEM 对象这样的可重用对象来创建?

所需的 json 格式

4

2 回答 2

1

那是因为你有一个对象列表或数组。您提供的 JSON 只是一个包含嵌套对象的对象。基本上作为经验法则;

在 C# 代码中您看到 "propertyName": { ... } 的任何地方都需要和对象 看到 "propertyName": [ ... ] 的任何地方都需要包含类型的List<T>or T[](array)。您将不得不编写一个自定义序列化程序,因为整数在 C# 中不是有效的属性名称,并且您的示例 json 中的一堆对象的名称类似于“7”。

所以要为你做一点,你需要这样的东西;

public class jsonWrapper
{
    public Seven seven { get; set; }
}

public class Seven
{
    public All all { get; set; }
}

public class All
{
    public Cars cars { get; set; }
}

public class Cars
{
    public Portrait Portrait { get; set; }
}

public class Portrait
{
    public Landscape Landscape { get; set; }
}

public class Landscape
{
    public Background Background { get; set; }
}

public class Background
{
     public Element[] Elements { get; set; } // the only array I see in your json
}

public class Element
{
    //properties that you have collapsed
}
于 2013-08-30T22:26:00.713 回答
0

让您的 OEM id 使用数字属性名称序列化的一种方法是将它们放入字典并序列化,而不是Oems列表。以下是您可以轻松做到这一点的方法:

// Original list of OEM objects
List<asbs.OEM> Oems = new List<asbs.OEM>();
Oems.Add(new asbs.OEM() { OemID = 7 });
Oems.Add(new asbs.OEM() { OemID = 8 });
Oems.Add(new asbs.OEM() { OemID = 27 });

// Create a new dictionary from the list, using the OemIDs as keys
Dictionary<int, asbs.OEM> dict = Oems.ToDictionary(o => o.OemID);

// Now serialize the dictionary
string json = JsonConvert.SerializeObject(dict, Formatting.Indented);

您可能还想用[JsonIgnore]属性修饰 OemID 属性,使其不包含在序列化输出的其他位置(除非您希望它存在)。

对于其他属性,如果它们在类中的名称与您希望序列化输出的名称不同,您可以使用该[JsonProperty]属性来控制它。

public class OEM
{
    [JsonIgnore]
    public int OemID { get; set; }

    [JsonProperty(PropertyName="cars")]
    public CarInfo Cars { get; set; }

    [JsonProperty(PropertyName = "suvs")]
    public CarInfo Suvs { get; set; }

    // other properties
}

这应该足以让你开始。如果您需要对输出内容进行更多控制,可以考虑JsonConverter为您的OEM类创建自定义。

于 2013-08-31T00:12:21.107 回答