如何将一串json格式的数据转换为匿名对象?
答案 0 :(得分:11)
C#4.0添加了可以使用的动态对象。看看this。
答案 1 :(得分:8)
使用动力学是这样的:
string jsonString = "{\"dateStamp\":\"2010/01/01\", \"Message\": \"hello\" }";
dynamic myObject = JsonConvert.DeserializeObject<dynamic>(jsonString);
DateTime dateStamp = Convert.ToDateTime(myObject.dateStamp);
string Message = myObject.Message;
答案 2 :(得分:1)
vb.net使用Newtonsoft.Json:
dim jsonstring = "..."
dim foo As JObject = JObject.Parse(jsonstring)
dim value1 As JToken = foo("key")
e.g.:
dim jsonstring = "{"MESSAGE":{"SIZE":"123","TYP":"Text"}}"
dim foo = JObject.Parse(jsonstring)
dim messagesize As String = foo("MESSAGE")("SIZE").ToString()
'now in messagesize is stored 123 as String
所以你不需要一个固定的结构,但你需要知道你能在那里找到什么。
但如果你甚至不知道里面是什么,那么你可以通过导航成员枚举那个JObject,例如.first(),. next() 例如:所以你可以实现经典的深度优先搜索和筛选JObject
(用于将vb.net转换为c#:http://converter.telerik.com/)
答案 3 :(得分:0)
我认为最接近的是.NET 4.0中的dynamic
匿名对象不起作用的原因是因为它们仍然是静态类型的,并且编译器无法为仅作为字符串存在的类提供intellisense。
答案 4 :(得分:0)
使用Newtonsoft.Json,使用DeserializeAnonymousType:
string json = GetJsonString();
var anonType = new { Order = new Order(), Account = new Account() };
var anonTypeList = new []{ anonType }.ToList(); //Trick if you have a list of anonType
var jsonResponse = JsonConvert.DeserializeAnonymousType(json, anonTypeList);
我的答案基于以下答案:https://stackoverflow.com/a/4980689/1440321
答案 5 :(得分:0)
由于没有人提到 SimpleJSON,所以我将其添加到此处。这是一个小类(低于 50k),您只需要使用其中一个文件(Unity、.NET 或 Binary),与 NewtonSoft 库(当前为 JSON.NET)相比,这令人印象深刻。它不需要您在程序中包含整个 C# 编译器,而且速度相对较快(需要进行一些调整以使其更快)。它也有延迟加载,当你只需要读取它的一部分时,它不会解析整个 JSON。
解析是这样完成的
JSONNode node = JSON.Parse(str)
访问内容就是这样
node["key"].AsString
node["key"].AsInt
node["key"].AsArray // To access JSON Array
node["key"].AsObject // To access JSON in key as object
...
或者你可以像这样继续使用括号
node["key1"]["key2"]["key3"].AsString
要创建 JSON 字符串,我将使用 StringBuilder 并手动生成 json 字符串,这是有史以来最快的方法。但是如果你愿意,你可以像这样使用 SimpleJson
JSONNode node = new JSONObject();
node["key"]= "some data";
node["key1"] = new JSONObject();
node["key1"]["key2"] = "another data";
String s = node.ToString();
会生成如下的json字符串
{
"key":"somedata",
"key1": {
"key2":"another data"
}
}
如果key不存在,以前的版本不会抛出异常并返回默认值(在C#标准中定义,但当前版本会抛出异常。