C #에서 JSON 문자열을 객체로 변환하려고합니다. 정말 간단한 테스트 사례 사용 :
JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
문제는 route_list가 설정되지 않는다는 것입니다. 정의되지 않은 객체입니다. 어떤 아이디어?
답변
원시 객체로 직렬화 해제하려고하는 것 같습니다. 변환하는 객체를 나타내는 클래스를 만들 수 있습니다. 더 큰 객체 또는 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
답변
또는 다음과 같이 Newtownsoft.Json 라이브러리를 사용할 수 있습니다.
using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);
T
JSON 문자열과 일치하는 객체 유형은 어디에 있습니까 ?
답변
route_list를 object
유형 으로 선언하고 싶지는 않을 것입니다 . .test 속성이 없으므로 멋진 객체를 다시 얻지 못할 것입니다. 이것은 클래스 또는 구조체를 정의하거나 dynamic 키워드를 사용하는 것이 더 나은 곳 중 하나입니다.
이 코드가 실제로 작동하도록하려면 DeserializeObject에서 반환 한 객체가 문자열, 객체의 일반 사전이라는 것을 알아야합니다. 그렇게하는 코드는 다음과 같습니다.
var json_serializer = new JavaScriptSerializer();
var routes_list = (IDictionary<string, object>)json_serializer.DeserializeObject("{ \"test\":\"some data\" }");
Console.WriteLine(routes_list["test"]);
동적 키워드를 사용하려면 여기에서 방법을 읽을 수 있습니다 .
클래스 나 구조체를 선언하면 다음과 같이 DeserializeObject 대신 Deserialize를 호출 할 수 있습니다.
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);
}
}
답변
JavaScriptSerializer와 함께 동적 객체 사용
JavaScriptSerializer serializer = new JavaScriptSerializer();
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];
//test Result = "some data"
답변
Newtonsoft는 자바 스크립트 시리얼 라이저보다 빠릅니다. … 이것은 Newtonsoft NuGet 패키지에 의존하는데, 이것은 기본 시리얼 라이저보다 널리 사용됩니다.
한 줄의 코드 솔루션.
var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);
Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);
답변
여기에 여러 게시물에서 함께 모은 간단한 클래스가 있습니다 …. 약 15 분 동안 테스트되었지만 내 목적으로는 효과가있는 것 같습니다 . JavascriptSerializer
작업을 수행하는 데 사용 되며이 게시물에 자세히 설명 된 정보를 사용하여 앱에서 참조 할 수 있습니다 .
LinqPad에서 아래 코드를 실행하여 테스트 할 수 있습니다.
- LinqPad에서 스크립트 탭을 마우스 오른쪽 버튼으로 클릭하고 “쿼리 속성”을 선택하십시오.
- “추가 참조”의 “System.Web.Extensions.dll”참조
- “System.Web.Script.Serialization”의 “추가 네임 스페이스 가져 오기”추가
그것이 도움이되기를 바랍니다!
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;
}
}
답변
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을 파싱하는 매우 간단한 방법입니다.