2013-08-16 2 views
0

내 JSON 문자열JSON 문자열을 deserialize하는 동안 String.Join을 수행하는 방법은 무엇입니까?

{ 
    "account_id": "123456", 
    "capabilities": [ 
     2, 
     6, 
     15, 
     11 
    ], 
    "currency": "USD" 
} 

내 클래스 정의

public class AdAccount 
{ 
    public long account_id { get; set; } 
    public string currency { get; set; } 
    public List<int> capabilities { get; set; } 
} 

Desearialization 코드 :

var account = JsonConvert.DeserializeObject<Account>(data, new JsonSerializerSettings() { MissingMemberHandling = Newtonsoft.Json.MissingMemberHandling.Ignore }); 

이 모두 잘 작동합니다. 그러나 내가 원하는 것은 "능력"이 "2,6,15,11"와 같이 쉼표로 분리 된 문자열이어야한다는 것입니다. 그래서

public class AdAccount 
{ 
    public long account_id { get; set; } 
    public string currency { get; set; } 
    private string _capabilities; 
    public string capabilities { get { return _capabilities; } set { _capabilities = String.Join(",", value); } } 
} 

을 시도하지만이 예외를

을 읽는 동안 오류 문자열을 던졌습니다. 예기치 않은 토큰 : StartArray. 경로 '기능'행 1, 위치 544

역 직렬화 중에 원하는 것을 할 수 있습니까?

감사합니다.

+0

@rjv_mjn 당신은'public String capabilities {get; 세트; }'public 목록 대신 capabilities {get; 세트; } ' – kbvishnu

+2

메모리 내 표시를 사용하기가 더 어려운 이유는 무엇입니까? 반드시 필요할 때만 * 더 멋진 표현 ('Account')으로 목록을 변형하는 것이 더 낫습니다. –

+0

@JonSkeet 필자가 작성한 코드의 목적은 JSON 문자열을 가져 와서 데이터 처리 비트를 dB로 지정하는 것입니다. "능력"값은 우리에게별로 중요하지 않지만 우리가받는 데이터를 버리는 코드는 싫어합니다. JSON -> 역 직렬화 된 Obj -> DB. 감사. – Justin

답변

0

나는 당신이 두 가지 표현이 제안 :

  • 조인 한 List<int>
  • "데이터베이스"표현이있는 "자연"표현 string

당신이 할 수있는 하나에서 다른 변환기로 쉽게 변환 할 수 있으므로 직렬화/직렬화 해제 경로 자체에서 특별한 작업을 수행 할 필요가 없음을 의미합니다. . 물론 비용은 두 모델로 끝나는 것입니다. 대다수의 코드가 "자연스러운"표현을 사용하도록 권장합니다. 데이터베이스를 처리 할 때 DB 표현을 디딤돌로 사용하십시오.

+0

이 답변을 선택했기 때문에 하나의 특정 인스턴스에 대한 사용자 지정 코드를 작성하지 않았으며 (약간의 리던던시가 언급되었지만) 더 의미가있었습니다. 감사. – Justin

2

표시 값 (CSV)을 보유 할 추가 속성을 만드는 것이 좋습니다. 이 속성은 읽기 전용이며 목록이 업데이트 될 때 자체를 업데이트/다시 계산합니다.

public class AdAccount 
{ 
    public long account_id { get; set; } 
    public string currency { get; set; } 
    public List<int> capabilities { get; set; } 

    public string capabilitiesDisplay 
    { 
     get 
     { 
      return string.Join(", ", capabilities); 
     } 
    } 
} 

Json 파서가 속성을 무시하도록 무시를 추가해야하는지 확실하지 않습니다.

이 접근 방식의 이점은 값에 액세스 할 때만 값이 계산된다는 것입니다.

+0

'이 방법의 장점은 값에 액세스 할 때만 값이 계산된다는 것입니다. 그리고 값에 액세스 할 때마다. – I4V

+0

@ I4V, 예, _every_ 액세스로 계산됩니다. 사소한 일이라면 괜찮을 것입니다. 하지만 대형 시스템의 경우 느린 로딩 구현을 살펴볼 수 있습니다. – gunr2171

+0

@ gunr2171 감사합니다. 모두 실패하면 읽기 전용 속성을 끝낼 수 있습니다. 한 번만 액세스하므로 성능이 그렇게 나쁘지 않아야합니다. 또한 int 배열은 최대 5-10 개 항목입니다. – Justin

2

당신은 문자열

var obj = JsonConvert.DeserializeObject<AdAccount>(json,new MyConverter()); 

List<int>에서 암시 적 변환을 수행 할 수있는 사용자 정의 변환기을 만들 수 있습니다.

public class MyConverter : JsonConverter 
{ 
    public override bool CanConvert(Type objectType) 
    { 
     return objectType == typeof(string); 
    } 

    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) 
    { 
     if (objectType == typeof(string) && reader.TokenType == JsonToken.StartArray) 
     { 
      List<long> nums = new List<long>(); 
      reader.Read(); 
      while (reader.TokenType != JsonToken.EndArray) 
      { 
       nums.Add((long)reader.Value); 
       reader.Read(); 
      } 
      return String.Join(",", nums); 
     } 
     return existingValue; 
    } 

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) 
    { 
     throw new NotImplementedException(); 
    } 
} 

public class AdAccount 
{ 
    public long account_id { get; set; } 
    public string currency { get; set; } 
    public string capabilities { get;set; } 
} 
+0

그는 다른 방법을 원합니다 (List 은 쉼표로 구분 된 문자열로 분석됩니다). –

+0

@SimonBelanger 나는 대답을 업데이 트, 그것은 두 가지 방법으로 작동합니다 .... – I4V

+0

내 말은 무슨 뜻입니까 오는 json 목록입니다. 디시리얼라이저는 대신 문자열을 사용합니다. :) –

0

List<int> 속성을 구문 분석 한 추가 속성이 있고이 속성을 List<int> 속성으로 설정하십시오.

public class AdAccount 
{ 
    public long account_id { get; set; } 
    public string currency { get; set; } 
    private List<int> _capabilities; 
    public List<int> capabilities 
    { 
     get { return _capabilities; } 
     set { _capabilities = value; this.ParsedCapabilities = string.Join(",", value); } 
    } 
    public string ParsedCapabilities { get; set; } 
} 
관련 문제