C# 从Json创建的键值列表,转换回Json

C# 从Json创建的键值列表,转换回Json,c#,json,C#,Json,我使用了一些代码将各种Json文件转换为键值列表。现在,我需要能够反转该过程并重新创建原始Json。下面是一些Json和创建键值对的代码的示例 我的问题是,是否有一个Json库可以将键值列表转换回Json,或者这个过程是以编程方式解析每个键并重新创建每个Json元素 注意:这不是关于如何从Json创建列表的问题,因为我已经得到了列表。问题是如何将列表转换回Json。下面显示的是一个随机Json示例,我的工作将涉及类似的Json,其中包含嵌套集合等 原始Json: { "firstName":

我使用了一些代码将各种Json文件转换为键值列表。现在,我需要能够反转该过程并重新创建原始Json。下面是一些Json和创建键值对的代码的示例

我的问题是,是否有一个Json库可以将键值列表转换回Json,或者这个过程是以编程方式解析每个键并重新创建每个Json元素

注意:这不是关于如何从Json创建列表的问题,因为我已经得到了列表。问题是如何将列表转换回Json。下面显示的是一个随机Json示例,我的工作将涉及类似的Json,其中包含嵌套集合等

原始Json:

{
  "firstName": "John",
  "lastName": "Smith",
  "isAlive": true,
  "age": 25,
  "address": {
    "streetAddress": "21 2nd Street",
    "city": "New York",
    "state": "NY",
    "postalCode": "10021-3100"
  },
  "phoneNumbers": [
    {
      "type": "home",
      "number": "212 555-1234"
    },
    {
      "type": "office",
      "number": "646 555-4567"
    },
    {
      "type": "mobile",
      "number": "123 456-7890"
    }
  ],
  "children": [],
  "spouse": null
}
Json到键值列表输出:

执行Json到列表转换的代码:

static void Main()
{
    var json = File.ReadAllText(@"c:\temp\test.txt");
    var obj = JObject.Parse(json);

    var result = obj.Descendants()
                    .OfType<JProperty>()
                    .Select(p => new KeyValuePair<string, object>
                (p.Path, p.Value.Type == JTokenType.Array || p.Value.Type == JTokenType.Object
                        ? null : p.Value));

    var keyValueResult = result.ToDictionary(x => x.Key, x => x.Value);

    Console.ReadLine();
}

我喜欢的库是NewtonSoft的Json.Net

然后,您可以将JSON发布到该工具中:

这将为您生成C类,如下所示:

public class Address
{
    public string streetAddress { get; set; }
    public string city { get; set; }
    public string state { get; set; }
    public string postalCode { get; set; }
}

public class PhoneNumber
{
    public string type { get; set; }
    public string number { get; set; }
}

public class RootObject
{
    public string firstName { get; set; }
    public string lastName { get; set; }
    public bool isAlive { get; set; }
    public int age { get; set; }
    public Address address { get; set; }
    public List<PhoneNumber> phoneNumbers { get; set; }
    public List<object> children { get; set; }
    public object spouse { get; set; }
}
var json = File.ReadAllText(@"c:\temp\test.txt");
RootObject ro = JsonConvert.DeserializeObject<RootObject>(json);

这使它变得更容易。

您可以使用JObject键访问该值

         string json = @"{
  'channel': {
    'title': 'James Newton-King',
    'link': 'http://james.newtonking.com',
    'description': 'James Newton-King\'s blog.',
    'item': [
      {
        'title': 'Json.NET 1.3 + New license + Now on CodePlex',
        'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'CodePlex'
        ]
      },
      {
        'title': 'LINQ to JSON beta',
        'description': 'Announcing LINQ to JSON',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'LINQ'
        ]
      }
    ]
  }
}";

JObject rss = JObject.Parse(json);

string rssTitle = (string)rss["channel"]["title"];
// James Newton-King

string itemTitle = (string)rss["channel"]["item"][0]["title"];
// Json.NET 1.3 + New license + Now on CodePlex

JArray categories = (JArray)rss["channel"]["item"][0]["categories"];
// ["Json.NET", "CodePlex"]

IList<string> categoriesText = categories.Select(c => (string)c).ToList();
// Json.NET
// CodePlex

您可以找到更多内容

您可以使用Json.Net,在那里您可以使用JSONCONVERT序列化和反序列化您的hein对象

您实际上不需要json2charp。您只需将JSON复制到剪贴板,在Visual studio中转到编辑->粘贴特殊->粘贴JSON作为类。键/列表对存储在数据库中,这对我来说很好。我需要一种方法来获取键和值中的内容并将其转换回Json。我不需要生成类。示例Json只是一个示例,我必须处理所有类型的嵌套Json,并且能够在需要时将其返回到Json。@Retrocoder:您要求一个库来帮助您,所以这就是我提供的示例。很多数据库都将以JSON格式输出数据,所以为什么不研究一下呢。@jason.kaisersmith我的问题是如何获取现有的键值对列表,并在运行时从中创建JSON。每个列表都有不同的结构,所以我不认为你的答案能帮我做到这一点。请解释一下你目前的代码有什么问题。这不需要改变。它生成了一个键值列表,其中键是原始json中的值的路径。我想要的是一种将列表转换回json的方法。我无法更改键值列表,这是企业提供的,我无法控制。我需要做的是从列表中重新创建原始json。我想问的是,众多json库中是否有一个功能可以帮助实现这一点。如果没有人听说过,那么我想我必须手动重新创建嵌套的json。要转换回列表,您应该将每个属性的完整路径存储在原始json中,然后手动转换回。Json库不会为您带来这种魔力。如果不允许更改键值列表,则重新创建源JSON只是一个选项here@PavelAnikhouski如我的示例列表所示,我存储完整路径。从我的谷歌搜索中,我认为这将是一个手动过程,但我想我会在这里检查一下,以防有人知道一个图书馆可以帮助我做一些艰苦的工作。
         string json = @"{
  'channel': {
    'title': 'James Newton-King',
    'link': 'http://james.newtonking.com',
    'description': 'James Newton-King\'s blog.',
    'item': [
      {
        'title': 'Json.NET 1.3 + New license + Now on CodePlex',
        'description': 'Announcing the release of Json.NET 1.3, the MIT license and the source on CodePlex',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'CodePlex'
        ]
      },
      {
        'title': 'LINQ to JSON beta',
        'description': 'Announcing LINQ to JSON',
        'link': 'http://james.newtonking.com/projects/json-net.aspx',
        'categories': [
          'Json.NET',
          'LINQ'
        ]
      }
    ]
  }
}";

JObject rss = JObject.Parse(json);

string rssTitle = (string)rss["channel"]["title"];
// James Newton-King

string itemTitle = (string)rss["channel"]["item"][0]["title"];
// Json.NET 1.3 + New license + Now on CodePlex

JArray categories = (JArray)rss["channel"]["item"][0]["categories"];
// ["Json.NET", "CodePlex"]

IList<string> categoriesText = categories.Select(c => (string)c).ToList();
// Json.NET
// CodePlex