我们有一个JSON结构,我们从服务器向客户端发送一组键值配对。为了简洁和整洁,我们发送如下数据:
"identification": {
"lineItem/latestDate": "2013-04-28",
"lineItem/destination": "test",
"lineItem/quantity": "55"
}
而不是:
"identification": [
{
"value": "test",
"type": "lineItem/destination"
},
{
"value": "2014-07-25",
"type": "lineItem/latestDate"
},
{
"value": "55",
"type": "lineItem/quantity"
}
]
问题是我们的下游客户端(使用C#处理JSON)说他们无法处理第一种格式,因为内置的json.net功能不支持它,他们不知道另一种可以做到这一点
是否可以使用C#中内置的JSON反序列化反序列化第一种格式?或者有没有人知道另一个可以解决这个问题的图书馆?我看了一下这个question对我而言看起来很可能。
答案 0 :(得分:5)
在这里,我找到了另一种方法,好消息是我们不必更改关键名称。
在客户端创建一个类:
public class RootObject
{
public Dictionary<string,string> identification { get; set; }
}
现在,反序列化它:
string data = @"[
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
},
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
},
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
}]";
List<RootObject> ob = JsonConvert.DeserializeObject<List<RootObject>>(data);
宾果,我们又做了。
1)现在,ob对象具有所需的值。
2)使用值数组。
3)也支持迭代。
答案 1 :(得分:4)
1)鉴于第一个JSON无效,在开始时需要左括号,并且从最后删除一个额外的逗号。
2)如果您的客户端可以使用Newtonsoft.Json,您可以在密钥中使用“_”而不是“/”,因为c#中不支持名称中带有“/”的标识符
客户端:
创建类
public class Identification
{
public string lineItem_latestDate { get; set; }
public string lineItem_destination { get; set; }
public string lineItem_quantity { get; set; }
}
public class RootObject
{
public Identification identification { get; set; }
}
注意:如果您有更多的键/值对,则可以向类标识
添加更多属性现在,将其反序列化为:
string data = @"[
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
},
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
},
{
""identification"": {
""lineItem_latestDate"": ""2013-04-28"",
""lineItem_destination"": ""test"",
""lineItem_quantity"": ""55""
}
}]";
List<RootObject> ob = JsonConvert.DeserializeObject<List<RootObject>>(data);
完成后,现在ob对象根据数据具有值。
答案 2 :(得分:2)
Json.Net DOES支持反序列化键值配对:您只需要使用Dictionary<string, T>
,其中T
可以是object
,JToken
或其他类可以接收数据值(string
适用于您的情况)。使用字典实际上很容易反序列化和迭代值,如下所示:
class Program
{
static void Main(string[] args)
{
string json = @"
{
""identification"": {
""lineItem/latestDate"": ""2013-04-28"",
""lineItem/destination"": ""test"",
""lineItem/quantity"": ""55"",
}
}";
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
foreach (KeyValuePair<string, string> kvp in obj.identification)
{
Console.WriteLine("type: " + kvp.Key);
Console.WriteLine("value: " + kvp.Value);
Console.WriteLine();
}
}
}
class RootObject
{
public Dictionary<string, string> identification { get; set; }
}
输出:
type: lineItem/latestDate
value: 2013-04-28
type: lineItem/destination
value: test
type: lineItem/quantity
value: 55