用Newtonsoft重新创建Json文件

时间:2013-08-30 22:01:28

标签: c# json json.net

我正在尝试创建一个类库,允许我从列表中读取数据,然后以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对象这样的可重用对象来创建?

Desired json format

2 个答案:

答案 0 :(得分:1)

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

你看到“propertyName”的任何地方:{...}你需要和C#代码中的对象 您看到“propertyName”的任何地方:[...]您需要封闭类型的List<T>T[](数组)。您将不得不编写自定义序列化程序,因为整数在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
}

答案 1 :(得分: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
}

这应该足以让你入门。如果您需要更多地控制输出内容,可以考虑为OEM类创建自定义JsonConverter