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