在开始之前,我应该说我对JSON几乎没有经验。我在这方面的所有经验都是在Java的SnakeYaml。。。
其次,如果你认为这个项目最好采用二级解决方案,请告诉我。。。
我有一个TCP服务器,它接受json格式的字符串,并返回包含请求信息的json格式字符串。下面是它将要做的一个例子。
请求
{
'MyName': 'John Doe'
'MandatoryLookup': false
}
响应
{
'John Doe': {
'Location' : 'Big Office Building'
'Additional': 'Floor 2'
}
}
本部分工作正常,仅供理解。
提供响应的服务器会在完成SQL查询后返回此信息。我希望它将这个查询保存在内存中(使用下面制作的自定义对象),并将其存储在磁盘上的json文件中。当服务器启动时,我希望它从这个json文件中读取并将其反序列化到我的对象中。这样,它几乎可以立即返回响应,而不必每次都执行查找。如果服务器手头没有信息,或者"MandatoryLookup"标志为true
,则会向SQL服务器查询响应。
这是自定义对象的类:
public class DataContainer
{
public string UserName { get; set; }
public info LocationInfo locationInfo;
}
public class LocationInfo
{
public string BuildingName { get; set; }
public string AdditionalInfo { get; set; }
}
^上面的想法转到了我读过的另一个关于子类别的StackOverflow线程,尽管我不知道下面提供的JSON字符串是否正确。
RecentLookups.json(这是我在启动时解析的保存到磁盘的文件)
{
'John Doe' : {
'Location' : 'Big Office Building',
'Additional' : 'Floor 2'
},
'Jane Doe' : {
'Location' : 'Small Office Building',
'Additional' : 'Security Office'
}
}
这最终分为三个问题
- 在研究如何格式化对象以进行反序列化时,最好从什么地方开始(因为现在的方式不起作用)
- 担心将格式化的sql查询预缓存到磁盘值得麻烦吗(sql查找是否足够快,每次只需查找值)
- 如何通过编程为每个Json组创建一个唯一命名的DataContainer对象?——以下示例
我的JSON组的名称是不可重复的名称——也就是说,不会有一个组的名称像"Jane Doe"。相反,提供这些示例是为了便于阅读。真实组名是对象的唯一标识符,子类别(位置、附加)是关于所述对象的信息。我希望每个DataContainer对象都有一个基于JSON类别名称的唯一名称,例如"Jane Doe"将是DataContainer JaneDoe
,其中设置了该对象的属性。
抱歉撞墙了,提前谢谢。
您可以将该JSON反序列化为Dictionary<string, LocationInfo>
:
var dictionary = JsonConvert.DeserializeObject<Dictionary<string, LocationInfo>>(jsonString);
请参见反序列化词典。如果需要,您可以转换为最终型号:
var list = dictionary.Select(pair => new DataContainer { UserName = pair.Key, locationInfo = pair.Value }).ToList();
此外,由于LocationInfo
中的c#POCO属性名称与接收的JSON中的名称不匹配,因此需要使用[JsonProperty]
属性手动设置映射:
public class LocationInfo
{
[JsonProperty("Location")]
public string BuildingName { get; set; }
[JsonProperty("Additional")]
public string AdditionalInfo { get; set; }
}