2017-02-08 1 views
3

RSA Archer가 사용하는 REST 서비스는 정수 키가 필요합니다. 즉, [Serializable] 개체를 중첩 할 수없고이어서 JsonUtility.ToJson()을 직렬화 할 수 없기 때문입니다. Dictionary 개체를 만들고 나서 ISerializationCallbackReceiver을 사용하여 중첩 된 구조체의 사전 조각을 처리하는 솔루션을 찾았지만 아래 코드는 중첩 된 개체의 해당 부분을 무시하고 Dictionary을 직렬화하지 않습니다. 누구든지 이것에 대한 최선의 접근법에 대한 생각을 갖고 있습니까?Unity가 JSON에 중첩 된 사전을 직렬화합니다.

예상 출력 :

{"Content": {"LevelId": 10,"FieldContents": {"47": {"Type": 1, "Value": "me", "FieldId": 47}}}} 

개체 구조 :

[Serializable] 
public class Record 
{ 
    public Content Content; 
} 

[Serializable] 
public class Content 
{ 
    public int LevelId; 
    public FieldContents FieldContents; 
} 

public class FieldContents : ISerializationCallbackReceiver 
{ 
    public Dictionary<string, FieldValue> FieldValues; 

    public List<string> dicKeys; 
    public List<FieldValue> dicVals; 

    public void OnBeforeSerialize() 
    { 
     dicKeys.Clear(); 
     dicVals.Clear(); 
     foreach (var kvp in FieldValues) { 
      dicKeys.Add (kvp.Key); 
      dicVals.Add (kvp.Value); 
     } 
    } 

    public void OnAfterDeserialize() 
    { 
     FieldValues = new Dictionary<string, FieldValue>(); 
     for (int i = 0; i < Math.Min (dicKeys.Count, dicVals.Count); i++) { 
      FieldValues.Add (dicKeys [i], dicVals [i]); 
     } 
    } 
} 

[Serializable] 
public class FieldValue 
{ 
    public int Type; 
    public string Value; 
    public int FieldId; 
} 

JSONUtility 및 인스턴스화 :

Record newRecord = new Record() { Content = new Content() { 
       LevelId = 10, 
       FieldContents = new FieldContents() { FieldValues = new Dictionary<string, FieldValue>() { { 
          "47", 
          new FieldValue() { 
           Type = 1, 
           Value = "me", 
           FieldId = 47 
          } 
         } 
        } 
       } 
      } 
     }; 
Debug.Log (JsonUtility.ToJson (newRecord)); 
+1

Unity의 'JsonUtility'은 ** 사전 **을 지원하지 않습니다. – Programmer

+0

@Programmer 그래서 'ISerializationCallbackReceiver'를 사용하려고했습니다. 다른 데이터 구조가 여기에 더 적합할까요? – hotshotiguana

+0

죄송합니다. 정말 이걸 도울 수는 없어요. 사전을 지원하는 유료 Json 플러그인을 사용해야합니다. 그건 네가 추천 한거야. – Programmer

답변

0

JsonUtility이 거의 발생하지 않는 한 jsons를 사용하는 가장 빠른 방법입니다 모든 GC. 문제는 데이터 구조를 미리 알아야하기 때문에 매우 유연하지 않으며 클래스가 필요하기 때문에 변형 될 수 없다는 것입니다.

당신이 사전으로 Jsons를 사용해야하는 경우 MiniJSON 중 하나를 사용할 수 있습니다

(바로 카릭과 다른 이름으로 저장 ...) 또는 JSONObject, 그들은 JsonUtilty보다 훨씬 느린 입력해도 모두가 그래서 만약, 모든 플랫폼에서 무료로 작업하다 당신은 큰 jsons를 파싱하거나 많은 시간을 할 필요가있는 동안 성능 문제는 유동적이지 않을 것입니다.

저는 개인적으로이 둘을 모두 사용했는데 훌륭합니다. MiniJSON은 조금 더 사용하기 쉽지만 JSONObject는 조금 더 강력하지만 시작하기가 조금 더 어렵습니다.

편집 :

당신은 또한 Newtonsoft 사용할 수있는 코멘트 하나에서 언급 한 바와 같이

, 나는 그것이 minijson과 된 JSONObject보다 빠른하지만 jsons와 함께 물건을 많이 수행하지 않는 경우 잔인한 것 같아요.

+0

고마워. @Juan. 확실히 제 3 자 라이브러리에 반대하지는 않지만 LitJSON을 사용하여이 작업을 수행 할 때 Hololens와 작업하기 위해 많은 문제를 겪었습니다. 따라서 JsonUtility로 대체되었습니다. 나는 다른 도서관을 시험해보고 그들이하는 일을 보게 될 것이다. – hotshotiguana

+0

bigjsons를 구문 분석 할 필요가 없다면 minijson을 추천합니다.이 스크립트는 스크립트 일 뿐이며 사용하기가 쉽습니다. 구글과 페이스 북은 화합을 위해 그들의 sdk에서 그것을 사용하고있다. –

관련 문제