尝试将JSON字符串转换为C#中的对象。使用一个非常简单的测试用例:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
问题是routes_list永远不会被设置;这是一个未定义的对象。有什么想法吗?
答案 0 :(得分:175)
或者,您可以按如下方式使用Newtonsoft.Json库:
using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);
其中T
是与您的JSON字符串匹配的对象类型。
答案 1 :(得分:117)
看起来你正在尝试反序列化为原始对象。您可以创建一个表示要转换为的对象的类。在处理较大对象或JSON字符串的情况下,这将非常有用。
例如:
class Test {
String test;
String getTest() { return test; }
void setTest(String test) { this.test = test; }
}
然后您的反序列化代码将是:
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
Test routes_list =
(Test)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
可以在本教程中找到更多信息: http://www.codeproject.com/Tips/79435/Deserialize-JSON-with-Csharp.aspx
答案 2 :(得分:53)
您可能不希望将routes_list声明为object
类型。它没有.test属性,所以你真的不会得到一个好的对象。这是您最好定义类或结构,或使用动态关键字的地方之一。
如果你真的希望这段代码能够正常工作,你需要知道DeserializeObject返回的对象是string,object的通用字典。这是以这种方式执行的代码:
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
如果您想使用动态关键字you can read how here。
如果声明一个类或结构,可以像这样调用Deserialize而不是DeserializeObject:
class MyProgram {
struct MyObj {
public string test { get; set; }
}
static void Main(string[] args) {
var json_serializer = new JavaScriptSerializer();
MyObj routes_list = json_serializer.Deserialize<MyObj>("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list.test);
Console.WriteLine("Done...");
Console.ReadKey(true);
}
}
答案 3 :(得分:28)
将动态对象与JavaScriptSerializer一起使用。
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];
//test Result = "some data"
答案 4 :(得分:18)
Newtonsoft比java脚本序列化程序更快。 ...这个依赖于Newtonsoft NuGet包,它比默认的序列化器更受欢迎。
一行代码解决方案。
var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);
Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
答案 5 :(得分:13)
这是一个简单的课程,我从各个帖子拼凑而成......已经测试了大约15分钟,但似乎为我的目的而工作。它使用JavascriptSerializer
来完成工作,可以使用详细信息in this post在您的应用中引用。
以下代码可以在LinqPad中运行,通过以下方式测试:
希望它有所帮助!
void Main()
{
string json = @"
{
'glossary':
{
'title': 'example glossary',
'GlossDiv':
{
'title': 'S',
'GlossList':
{
'GlossEntry':
{
'ID': 'SGML',
'ItemNumber': 2,
'SortAs': 'SGML',
'GlossTerm': 'Standard Generalized Markup Language',
'Acronym': 'SGML',
'Abbrev': 'ISO 8879:1986',
'GlossDef':
{
'para': 'A meta-markup language, used to create markup languages such as DocBook.',
'GlossSeeAlso': ['GML', 'XML']
},
'GlossSee': 'markup'
}
}
}
}
}
";
var d = new JsonDeserializer(json);
d.GetString("glossary.title").Dump();
d.GetString("glossary.GlossDiv.title").Dump();
d.GetString("glossary.GlossDiv.GlossList.GlossEntry.ID").Dump();
d.GetInt("glossary.GlossDiv.GlossList.GlossEntry.ItemNumber").Dump();
d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef").Dump();
d.GetObject("glossary.GlossDiv.GlossList.GlossEntry.GlossDef.GlossSeeAlso").Dump();
d.GetObject("Some Path That Doesnt Exist.Or.Another").Dump();
}
// Define other methods and classes here
public class JsonDeserializer
{
private IDictionary<string, object> jsonData { get; set; }
public JsonDeserializer(string json)
{
var json_serializer = new JavaScriptSerializer();
jsonData = (IDictionary<string, object>)json_serializer.DeserializeObject(json);
}
public string GetString(string path)
{
return (string) GetObject(path);
}
public int? GetInt(string path)
{
int? result = null;
object o = GetObject(path);
if (o == null)
{
return result;
}
if (o is string)
{
result = Int32.Parse((string)o);
}
else
{
result = (Int32) o;
}
return result;
}
public object GetObject(string path)
{
object result = null;
var curr = jsonData;
var paths = path.Split('.');
var pathCount = paths.Count();
try
{
for (int i = 0; i < pathCount; i++)
{
var key = paths[i];
if (i == (pathCount - 1))
{
result = curr[key];
}
else
{
curr = (IDictionary<string, object>)curr[key];
}
}
}
catch
{
// Probably means an invalid path (ie object doesn't exist)
}
return result;
}
}
答案 6 :(得分:9)
您可以使用Newtonsoft.Json库轻松完成您的要求。我正在写下面的一个例子,看看它。
您收到的对象类型的类:
public class User
{
public int ID { get; set; }
public string Name { get; set; }
}
<强>代码:强>
static void Main(string[] args)
{
string json = "{\"ID\": 1, \"Name\": \"Abdullah\"}";
User user = JsonConvert.DeserializeObject<User>(json);
Console.ReadKey();
}
这是解析json的一种非常简单的方法。
答案 7 :(得分:7)
添加此ddl以引用您的项目: System.Web.Extensions.dll
使用此命名空间:使用System.Web.Script.Serialization;
public class IdName
{
public int Id { get; set; }
public string Name { get; set; }
}
string jsonStringSingle = "{'Id': 1, 'Name':'Thulasi Ram.S'}".Replace("'", "\"");
var entity = new JavaScriptSerializer().Deserialize<IdName>(jsonStringSingle);
string jsonStringCollection = "[{'Id': 2, 'Name':'Thulasi Ram.S'},{'Id': 2, 'Name':'Raja Ram.S'},{'Id': 3, 'Name':'Ram.S'}]".Replace("'", "\"");
var collection = new JavaScriptSerializer().Deserialize<IEnumerable<IdName>>(jsonStringCollection);
答案 8 :(得分:6)
正如Tripletdad99所说
var result = JsonConvert.DeserializeObject<T>(json);
但是如果您不想创建额外的对象,则可以使用Dictionary
来创建它
var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);
答案 9 :(得分:4)
使这些步骤半自动化的另一种快速简便的方法是:
现在使用以下代码:
WebClient client = new WebClient();
string myJSON = client.DownloadString("https://URL_FOR_JSON.com/JSON_STUFF");
var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject(myJSON);
答案 10 :(得分:1)
复制您的Json并粘贴到json2csharp上的文本框中,然后单击“生成”按钮。
将使用以下cs文件生成 cs 类
var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);
RootObject
是生成的 cs 文件的名称;
答案 11 :(得分:0)
将JSON字符串转换为C#中的对象。使用下面的测试用例..它为我工作。在这里&#34; 菜单信息&#34;是我的C#类对象。
JsonTextReader reader = null;
try
{
WebClient webClient = new WebClient();
JObject result = JObject.Parse(webClient.DownloadString("YOUR URL"));
reader = new JsonTextReader(new System.IO.StringReader(result.ToString()));
reader.SupportMultipleContent = true;
}
catch(Exception)
{}
JsonSerializer serializer = new JsonSerializer();
MenuInfo menuInfo = serializer.Deserialize<MenuInfo>(reader);
答案 12 :(得分:0)
首先,你必须包括像:
这样的库using System.Runtime.Serialization.Json;
DataContractJsonSerializer desc = new DataContractJsonSerializer(typeof(BlogSite));
string json = "{\"Description\":\"Share knowledge\",\"Name\":\"zahid\"}";
using (var ms = new MemoryStream(ASCIIEncoding.ASCII.GetBytes(json)))
{
BlogSite b = (BlogSite)desc.ReadObject(ms);
Console.WriteLine(b.Name);
Console.WriteLine(b.Description);
}
答案 13 :(得分:0)
让我们假设您有一个类名Student
,它具有以下字段,并且它具有一种将JSON作为输入并返回字符串Student Object
的方法。我们可以在此处使用JavaScriptSerializer
将JSON字符串转换为C#对象。std
是JSON字符串。
public class Student
{
public string FirstName {get;set:}
public string LastName {get;set:}
public int[] Grades {get;set:}
}
public static Student ConvertToStudent(string std)
{
var serializer = new JavaScriptSerializer();
Return serializer.Deserialize<Student>(std);
}