2014-11-14 2 views
2

C# 클래스의 인스턴스로 비 직렬화하려는 일부 JSON이 있습니다. 그러나 클래스에는 원래 JSON과 일치하는 모든 필드/속성이 없습니다. 클래스의 속성 값을 수정 한 다음 원본 JSON의 나머지 필드와 속성을 그대로 JSON으로 다시 직렬화 할 수 있기를 원합니다. 예를 들어JSON 객체의 일부를 비 직렬화하고 나머지 속성을 그대로 직렬화합니다.

, 이제 나는 다음과 같은 JSON 있다고 가정 해 봅시다 :

{ 
    "name": "david", 
    "age": 100, 
    "sex": "M", 
    "address": "far far away" 
} 

을 그리고이 클래스로를 직렬화하는이 :

:

class MyClass 
{ 
    public string name { get; set; } 
    public int age { get; set; } 
} 

는 역 직렬화 후, 나는 다음과 같은 설정

myClass.name = "John"; 
myClass.age = 200; 

이제 JSON으로 다시 직렬화하여이 결과를 얻고 싶습니다.

{ 
    "name": "John", 
    "age": 200, 
    "sex": "M", 
    "address": "far far away" 
} 

Json.Net을 사용하여이를 수행 할 수있는 방법이 있습니까?

+0

그것의 정확히 무엇을 당신이 찾고있는 그러나 이것은 적어도 하나의 솔루션, http://stackoverflow.com/questions/1207731/how-can- 내가 작성했다 샘플입니다 i-deserialize-json-to-a-simple-dictionarystring-string-in-asp-net – Shriike

+1

왜 클래스에 속성을 추가하지 않습니까? –

+0

@MikkoViitala 다른 속성이 무엇인지 정확히 알지 못하거나 이름과 번호가 달라질 수 있습니다. –

답변

4

Json.Net의 "확장 데이터"기능을 사용하여이 문제를 해결할 수 있습니다.

클래스에 Dictionary<string, object> 속성을 새로 추가하고 [JsonExtensionData] 속성으로 표시하십시오. (클래스의 공용 인터페이스에 영향을 미치지 않으려면 private 속성으로 만들 수 있습니다.) deserialization에서이 사전은 클래스의 다른 public 속성과 일치하지 않는 데이터로 채워집니다. 직렬화에서 사전의 데이터는 객체의 속성으로 JSON에 다시 쓰여집니다. 여기

class MyClass 
{ 
    public string name { get; set; } 
    public int age { get; set; } 

    [JsonExtensionData] 
    private Dictionary<string, object> otherStuff { get; set; } 
} 

는 데모입니다 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     string json = @" 
     { 
      ""name"": ""david"", 
      ""age"": 100, 
      ""sex"": ""M"", 
      ""address"": ""far far away"" 
     }"; 

     MyClass obj = JsonConvert.DeserializeObject<MyClass>(json); 

     Console.WriteLine("orig name: " + obj.name); 
     Console.WriteLine("orig age: " + obj.age); 
     Console.WriteLine(); 

     obj.name = "john"; 
     obj.age = 200; 

     json = JsonConvert.SerializeObject(obj, Formatting.Indented); 
     Console.WriteLine(json); 
    } 
} 

출력 :

orig name: david 
orig age: 100 

{ 
    "name": "john", 
    "age": 200, 
    "sex": "M", 
    "address": "far far away" 
} 
0

좋아, 그래서 질문을 게시 한 후, 점심에 갔다 돌아와서 나는 해결책을 찾아 냈다. JSON.nets "확장 데이터"를 사용하는 대신 "병합"기능이 있다는 것을 알았습니다. http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-dependency-injection

IMO이 방법은 훨씬 더 명확하고이 방법으로 가기로 결정했습니다. 다음은

public class Cell 
{ 
    public string Text { get; set; } 
    public int ID { get; set; } 
    public CellStyle Style { get; set; } 
} 

public class CellStyle 
{ 
    public string BgColor { get; set; } 
    public string TextColor { get; set; } 
} 

string json = @"{ 
    'Text': 'My Cell', 
    'ID': 20, 
    'TsID': 100, 
    'Style': { 
       'BgColor' : 'Red', 
       'TextColor' : 'Black', 
       'Caption' : 'Help My Cell', 
      } 
}"; 

var orgCell = JsonConvert.DeserializeObject<Cell>(json); 
orgCell.Style.TextColor = "White"; 
orgCell.Style.BgColor = "Blue"; 

var obj = JsonConvert.SerializeObject(orgCell); 

JObject o1 = JObject.Parse(json); 
JObject o2 = JObject.Parse(obj); 

o1.Merge(o2, new JsonMergeSettings 
{ 
    // union array values together to avoid duplicates 
    MergeArrayHandling = MergeArrayHandling.Union 
}); 

o1.ToString(); // gives me the intended string 
+1

왜이 클리너를 고려해야하는지 잘 모르겠다. 퍼포먼스 관점에서 보면, 두 개의 추가 구문 분석과 병합을 수행하고 있습니다. –

+0

나는 실제로 어떤 방법을 사용할 지 모르겠습니다. JSON 자체에 여러 개의 중첩 된 레이어가 있기 때문에 걱정할 필요가 없습니다.하지만 적어도 솔루션을 해결할 수있는 옵션이 있습니다. – vkom

관련 문제