Newtonsoft JSON은 템플릿 직렬화

다니엘 더티 네이티브 마틴

클래스를 JSON 문자열로 직렬화하려고합니다. 첫째, 내 실제 코드 :

// Note that this class is inside a PCL
public class CommunicationMessage {

    public String Key { get; set; }

    public String Value { get; set; }

    public List<CommunicationMessage> Childs { get; set; }
}

다음과 같이 xml로 변환 할 수있는 템플릿입니다.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<myproject>
    <communicationmessage>
        <header>
             <participantid>1</participantid>
             <deviceid>54325</deviceid>
             <devicetype>Smartphone Samsung 4500</devicetype>
             <timestamp>3456453445</timestamp>
             <location>343-5343-64353</location>
             <networkid>32</networkid>
             <messageid>4003</messageid>
        </header>
        <data>
        </data>
    </communicationmessage>
</myproject>

보시다시피 Key 변수 는 이름이 communicationmessage 인 Xml-Element입니다 .

이제 U는 템플릿에 beeing는 JSON 문자열로 변환 원하지만 확실히 내가 요소 대신 얻을 communicationmessage 요소 "키": "communicationmessage" . "mymessage": "This is a test" 와 같은 요소에 대해 무언가를 얻을 수있는 방법이 있습니까? 여기서 "mymessage"는 키이고 "This is a test"는 값입니까?

도움을 주셔서 감사합니다

해결책

이 코드로 해결했습니다.

public class CommunicationMessageJSONSerializer : JsonConverter {

    /// <summary>
    /// Used to 
    /// </summary>
    /// <param name="objectType"></param>
    /// <returns></returns>
    public override bool CanConvert(Type objectType) {
        return typeof(CommunicationMessage).GetTypeInfo().IsAssignableFrom(objectType.GetTypeInfo());
    }

    /// <summary>
    /// Deserializes the JSON string
    /// </summary>
    /// <param name="reader"></param>
    /// <param name="objectType"></param>
    /// <param name="existingValue"></param>
    /// <param name="serializer"></param>
    /// <returns></returns>
    public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) {

        // Load the JSON object from the reader
        JObject jsonObject = JObject.Load(reader);

        // Get the First Token
        JToken token = jsonObject.Children().First();

        // The deserialized message
        CommunicationMessage msg = ReadJSON(token);
        return msg;
    }

    /// <summary>
    /// This is the base method when deserializing a JSON string
    /// </summary>
    /// <param name="token"></param>
    /// <returns>The root CommunicationMessage</returns>
    private CommunicationMessage ReadJSON(JToken token) {

        CommunicationMessage root = new CommunicationMessage();

        if (token is JProperty) {
            if (token.First is JValue) {
                root.Key = ((JProperty)token).Name;
                root.Value = (string)((JProperty)token).Value;
            } else { 
                root.Key = ((JProperty)token).Name;

                foreach (JToken child in token.Children()) {
                    ReadRecursive(child, ref root);
                }
            }
        } else {
            foreach (JToken child in token.Children()) {
                ReadRecursive(child, ref root);
            }
        }
        return root;
    }

    /// <summary>
    /// This is the recursive method when deserializing a JSON string
    /// </summary>
    /// <param name="token"></param>
    /// <param name="root">The root of the coming messages</param>
    private void ReadRecursive(JToken token, ref CommunicationMessage root) {

        if (token is JProperty) {

            CommunicationMessage msg = new CommunicationMessage();

            if (token.First is JValue) {
                msg.Key = ((JProperty)token).Name;
                msg.Value = (string)((JProperty)token).Value;
            } else {
                msg.Key = ((JProperty)token).Name;

                foreach (JToken child in token.Children()) {
                    ReadRecursive(child, ref msg);
                }
            }
            root.Childs.Add(msg);
        } else {
            foreach (JToken child in token.Children()) {
                ReadRecursive(child, ref root);
            }
        }
    }

    /// <summary>
    /// Serializes a CommuicationMessage to a JSON string
    /// </summary>
    /// <param name="writer"></param>
    /// <param name="value"></param>
    /// <param name="serializer"></param>
    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) {
        var msg = value as CommunicationMessage;
        WriteRecoursive(writer, msg, serializer);
    }

    /// <summary>
    /// This is the recursive method for serializing
    /// </summary>
    /// <param name="writer"></param>
    /// <param name="msg"></param>
    /// <param name="serializer"></param>
    private void WriteRecoursive(JsonWriter writer, CommunicationMessage msg, JsonSerializer serializer) {

        writer.WriteStartObject();
        writer.Formatting = Formatting.Indented;

        writer.WritePropertyName(msg.Key);

        if (msg.Childs.Count > 0) {
            writer.WriteStartArray();

            foreach (CommunicationMessage child in msg.Childs) {
                WriteRecoursive(writer, child, serializer);
            }

            writer.WriteEndArray();

        } else {
            writer.WriteValue(msg.Value);
        }

        writer.WriteEndObject();
    }
}

코드를 개선 할 아이디어가 있으면 알려주세요. 솔루션을 계속 업데이트하겠습니다.

도와 주셔서 감사합니다

제프 팡

사용자 지정 serialization을 사용 하거나 ISerializable을 구현하는 것 외에 다음을 수행 할 수 있습니다. 그러나이 메서드에는 모든 속성을 이와 같이 래핑해야하는 단점이 있습니다. 그렇지 않으면 속성이 직렬화되지 않습니다. 이 빠르고 더러운 방법은 작은 클래스에 적합하지만 더 복잡한 클래스를 만드는 경우 ISerializable을 구현하는 것이 좋습니다.

 public class CommunicationMessage : Dictionary<string, object>       
 {
    //this "hack" exposes the "Child" as a List
    public List<CommunicationMessage> Childs
    {
        get {
            return (List<CommunicationMessage>)this["Childs"];
        }
        set
        {
            this["Childs"] = value;
        }
    }

    public CommunicationMessage()
    {
        this["Childs"] = new List<CommunicationMessage>();
    }
 }

용법:

var m = new CommunicationMessage();
m["mymessage"] = "This is a test";

출력은 다음과 같아야합니다.

{
    "Childs": [],
    "mymessage": "This is a test"
}

대체 ISerializable 구현 :

public class CommunicationMessage:ISerializable
{
    public String Key { get; set; }

    public String Value { get; set; }

    public List<CommunicationMessage> Childs { get; set; }

    public void GetObjectData(SerializationInfo info, StreamingContext context)
    {
        info.AddValue(Key, Value);

        PropertyInfo[] pi=this.GetType().GetProperties();
        foreach(var p in pi)
        {
            if (p.Name == "Key" || p.Name == "Value")
                continue;
            info.AddValue(p.Name, p.GetValue(this));
        }
    }
}

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

분류에서Dev

Json 배열 Newtonsoft.Json 역 직렬화

분류에서Dev

Newtonsoft JSON을 null로 직렬화 해제

분류에서Dev

newtonsoft로 json 배열 역 직렬화

분류에서Dev

Newtonsoft json.net 역 직렬화 NullReferenceException

분류에서Dev

Newtonsoft.Json으로 역 직렬화

분류에서Dev

newtonsoft json 역 직렬화 오류 처리 : 부분 역 직렬화

분류에서Dev

Newtonsoft JSON은 목록에서 입력하기 위해 역 직렬화합니다.

분류에서Dev

Newtonsoft Json.NET은 직렬화 할 때 기본 datetime 값을 무시합니다.

분류에서Dev

Newtonsoft JSON 문제로 목록 역 직렬화

분류에서Dev

Newtonsoft.Json을 사용한 열거 형 역 직렬화

분류에서Dev

newtonsoft를 사용하는 json 구조의 직렬화 문제

분류에서Dev

newtonsoft json 스키마는 ValidationError를 직렬화 해제합니다.

분류에서Dev

C # MVC 컨트롤 Newtonsoft.json 직렬화

분류에서Dev

객체 목록 직렬화 / 비 직렬화를위한 JSON Newtonsoft C # 모범 사례

분류에서Dev

JSON을 변경하지 않고 JSON 배열의 NewtonSoft Inheretance 역 직렬화

분류에서Dev

C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

분류에서Dev

Newtonsoft.JSON을 사용하여 C #으로 Json 문자열 역 직렬화

분류에서Dev

newtonsoft JSON deseralizer를 사용하여 Geopoint를 어떻게 역 직렬화합니까?

분류에서Dev

C # Newtonsoft.Json 최상위 수준 만 역 직렬화 하시겠습니까?

분류에서Dev

Newtonsoft.Json을 사용하여 이름을 값으로 역 직렬화

분류에서Dev

json newtonsoft : 문자열 목록을 포함하는 객체 역 직렬화

분류에서Dev

C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

분류에서Dev

Newtonsoft.Json "추가"를 사용하여 컬렉션 역 직렬화

분류에서Dev

JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

분류에서Dev

System.Text.JSON은 Newtonsoft가 수행하는 작업을 역 직렬화하지 않습니다.

분류에서Dev

C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

분류에서Dev

VB.NET은 Newtonsoft JSON을 개체로 동적으로 역 직렬화합니다.

분류에서Dev

Python에서 C # Newtonsoft와 같은 클래스로 Json을 역 직렬화 할 수 있습니까?

분류에서Dev

튜플의 JSON 역 직렬화 문제?

Related 관련 기사

  1. 1

    Json 배열 Newtonsoft.Json 역 직렬화

  2. 2

    Newtonsoft JSON을 null로 직렬화 해제

  3. 3

    newtonsoft로 json 배열 역 직렬화

  4. 4

    Newtonsoft json.net 역 직렬화 NullReferenceException

  5. 5

    Newtonsoft.Json으로 역 직렬화

  6. 6

    newtonsoft json 역 직렬화 오류 처리 : 부분 역 직렬화

  7. 7

    Newtonsoft JSON은 목록에서 입력하기 위해 역 직렬화합니다.

  8. 8

    Newtonsoft Json.NET은 직렬화 할 때 기본 datetime 값을 무시합니다.

  9. 9

    Newtonsoft JSON 문제로 목록 역 직렬화

  10. 10

    Newtonsoft.Json을 사용한 열거 형 역 직렬화

  11. 11

    newtonsoft를 사용하는 json 구조의 직렬화 문제

  12. 12

    newtonsoft json 스키마는 ValidationError를 직렬화 해제합니다.

  13. 13

    C # MVC 컨트롤 Newtonsoft.json 직렬화

  14. 14

    객체 목록 직렬화 / 비 직렬화를위한 JSON Newtonsoft C # 모범 사례

  15. 15

    JSON을 변경하지 않고 JSON 배열의 NewtonSoft Inheretance 역 직렬화

  16. 16

    C #에서 Newtonsoft Json.NET을 사용하여 JSON 역 직렬화

  17. 17

    Newtonsoft.JSON을 사용하여 C #으로 Json 문자열 역 직렬화

  18. 18

    newtonsoft JSON deseralizer를 사용하여 Geopoint를 어떻게 역 직렬화합니까?

  19. 19

    C # Newtonsoft.Json 최상위 수준 만 역 직렬화 하시겠습니까?

  20. 20

    Newtonsoft.Json을 사용하여 이름을 값으로 역 직렬화

  21. 21

    json newtonsoft : 문자열 목록을 포함하는 객체 역 직렬화

  22. 22

    C #에서 Newtonsoft를 사용하여 중첩 된 JSON 개체의 역 직렬화

  23. 23

    Newtonsoft.Json "추가"를 사용하여 컬렉션 역 직렬화

  24. 24

    JSON Newtonsoft C # 다양한 유형의 객체 목록 역 직렬화

  25. 25

    System.Text.JSON은 Newtonsoft가 수행하는 작업을 역 직렬화하지 않습니다.

  26. 26

    C # Newtonsoft를 사용하여 JSON 파일을 역 직렬화하는 방법은 무엇입니까?

  27. 27

    VB.NET은 Newtonsoft JSON을 개체로 동적으로 역 직렬화합니다.

  28. 28

    Python에서 C # Newtonsoft와 같은 클래스로 Json을 역 직렬화 할 수 있습니까?

  29. 29

    튜플의 JSON 역 직렬화 문제?

뜨겁다태그

보관