JSON 문자열을 C # 객체로 변환


183

C #에서 JSON 문자열을 객체로 변환하려고합니다. 정말 간단한 테스트 사례 사용 :

JavaScriptSerializer json_serializer = new JavaScriptSerializer();
object routes_list = json_serializer.DeserializeObject("{ \"test\":\"some data\" }");

문제는 route_list가 설정되지 않는다는 것입니다. 정의되지 않은 객체입니다. 어떤 아이디어?


1
@Greg : JavaScriptSerializerWCF의 사용자 지정 JSON 형식 이외의 다른 형식은 허용하지 않으므로 실제로는 MS 버전 이상을 권장합니다 (예 : 날짜처럼 보이지만 DATE ()로 둘러싸여 있지 않은 날짜 필드는 잘못 표시됨)
Brad Christie

또한 .NET 기사 에서 JavascriptSerializer 로이 파싱 ​​JSON 객체를 살펴보십시오 . 실제로는 훌륭한 자습서입니다.
scatmoi

JavaScriptSerializer는 어디서 구할 수 있습니까? 내 C # .NET 3.5 프로젝트에서 인식되지 않습니다.
B. Clay Shannon

1
@비. Clay Shannon 이것은 나를 위해 그것을 해결했다 stackoverflow.com/questions/7000811/…
Fuzzybear

답변:


127

원시 객체로 직렬화 해제하려고하는 것 같습니다. 변환하는 객체를 나타내는 클래스를 만들 수 있습니다. 더 큰 객체 또는 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


1
그러나 지적 기사에서 자동 속성이 사용됩니다. 언급 할 가치가 있습니다.
Ivan Kochurkin

11
죄송하지만이 코드 샘플이 작동하지 않습니다. DeserializeObject에서 예외가 발생합니다. var route_list = serializer.Deserialize <Test> ( "{\"test \ ": \"some data \ "}")를 사용하십시오. 대신에. 또한 get / setTest ()가 필요하지 않으며 문자열 테스트는 공개되어야합니다. 이것은 C #보다 java와 비슷합니다.
dvallejo

Dan Vallejo가 언급했듯이 이것은 잘못된 해결책입니다. 결국 setTest (String test)가 반환되지 않아 컴파일 오류가 발생합니다.
Payam

1
이것을 사용할 수도 있습니다 : json_serializer.Deserialize <Test> ( "{\"test \ ": \"some data \ "}"); // 대신 (테스트) json_serializer .....
바샤 르 아부 Shamaa

1
클래스 객체의 형식이 확실하지 않으면이 링크를 사용해보십시오 . Json 문자열을 올바른 클래스로 변환합니다. 많은 시간을 절약했습니다!
jade290

231

또는 다음과 같이 Newtownsoft.Json 라이브러리를 사용할 수 있습니다.

using Newtonsoft.Json;
...
var result = JsonConvert.DeserializeObject<T>(json);

TJSON 문자열과 일치하는 객체 유형은 어디에 있습니까 ?


3
너무 쉬워서 이렇게하는 방법에 대해 너무 오래 생각했습니다.
maracuja-juice

58

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);
    }
}

하기 : json_serializer = 새로운 JavaScriptSerializer (); object route_list = (IDictionary <string, object>) json_serializer.DeserializeObject ( "{\"test \ ": \"일부 데이터 여기 \ "}"); 현재 컨텍스트에 여전히 'routes_list'가 없습니다.
Justin

1
를 사용하지 마십시오 object routes_list. var자신을 사용 하거나 명시 적으로 반복하고 route_list를 IDictionary <string, object>로 선언하십시오.
mattmc3

31

JavaScriptSerializer와 함께 동적 객체 사용

JavaScriptSerializer serializer = new JavaScriptSerializer(); 
dynamic item = serializer.Deserialize<object>("{ \"test\":\"some data\" }");
string test= item["test"];

//test Result = "some data"

19

Newtonsoft는 자바 스크립트 시리얼 라이저보다 빠릅니다. ... 이것은 Newtonsoft NuGet 패키지에 의존하는데, 이것은 기본 시리얼 라이저보다 널리 사용됩니다.

한 줄의 코드 솔루션.

var myclass = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(Jsonstring);

Myclass oMyclass = Newtonsoft.Json.JsonConvert.DeserializeObject<Myclass>(Jsonstring);

15

여기에 여러 게시물에서 함께 모은 간단한 클래스가 있습니다 .... 약 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;
  }
}

14

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을 파싱하는 매우 간단한 방법입니다.


11

tripletdad99가 말했듯이

var result = JsonConvert.DeserializeObject<T>(json);

그러나 추가 객체를 만들고 싶지 않으면 Dictionary대신 객체를 만들 수 있습니다

var result = JsonConvert.DeserializeObject<Dictionary<string, string>>(json_serializer);

매개 변수를 Url.Action (action, controller, result)에 전달하면 유용합니다.
Lapenkov Vladimir

8

프로젝트를 참조하기 위해이 ddl을 추가하십시오 : System.Web.Extensions.dll

이 네임 스페이스를 사용하십시오 : using 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);

6

Json을 복사하여 json2csharp의 텍스트 상자에 붙여 넣고 생성 버튼을 클릭하십시오.

연사 클래스는 CS 파일이 사용을 생성됩니다 아래로

var generatedcsResponce = JsonConvert.DeserializeObject(yourJson);

RootObject생성 된 cs 파일 의 이름은 어디에 있습니까 ?


4

이러한 단계를 반 자동화하는 또 다른 빠르고 쉬운 방법은 다음과 같습니다.

  1. 파싱하려는 JSON을 가져 와서 여기에 붙여 넣으십시오 : https://app.quicktype.io/ . 드롭 다운에서 언어를 C #으로 변경하십시오.
  2. 왼쪽 상단의 이름을 수업 이름으로 업데이트합니다. 기본값은 "환영합니다"입니다.
  3. Visual Studio에서 웹 사이트-> 패키지 관리로 이동하고 NuGet을 사용하여 Newtonsoft에서 Json.Net을 추가하십시오.
  4. app.quicktype.io는 Newtonsoft를 기반으로 직렬화 메소드를 생성했습니다. 또는 다음과 같은 코드를 사용할 수 있습니다.

    WebClient 클라이언트 = 새로운 WebClient ();

    문자열 myJSON = client.DownloadString ( " https://URL_FOR_JSON.com/JSON_STUFF ");

    var myClass = Newtonsoft.Json.JsonConvert.DeserializeObject (myJSON);


더 이상 유효하지 않은 링크
Myles J

Myles J에게 감사합니다. 제대로 작동하는 새 사이트로 업데이트했습니다.
Jason Hitchings

0

JSON 문자열을 C #의 객체로 변환하십시오. 아래 테스트 사례를 사용하여. 그것은 나를 위해 일했습니다. 여기서 " MenuInfo "는 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);

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);
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.