【发布时间】:2011-07-12 22:27:41
【问题描述】:
如何将一串 json 格式的数据转换成匿名对象?
【问题讨论】:
-
您使用的是什么版本的 .net? C# 4.0 增加了可以使用的动态对象。
-
4,这样我可以把json转成动态对象吗?
如何将一串 json 格式的数据转换成匿名对象?
【问题讨论】:
C# 4.0 添加了可以使用的动态对象。看看this。
【讨论】:
System.Web.Script.Serialization的dll的名称是什么?
使用动态是这样的:
string jsonString = "{\"dateStamp\":\"2010/01/01\", \"Message\": \"hello\" }";
dynamic myObject = JsonConvert.DeserializeObject<dynamic>(jsonString);
DateTime dateStamp = Convert.ToDateTime(myObject.dateStamp);
string Message = myObject.Message;
【讨论】:
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/)
【讨论】:
使用 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
【讨论】:
我认为你能得到的最接近的是 .NET 4.0 中的dynamic
匿名对象不起作用的原因是它们仍然是静态类型的,编译器无法为仅作为字符串存在的类提供智能感知。
【讨论】:
由于没有人提到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# 标准中定义,但当前版本会抛出异常。
【讨论】: