CombineJSONMember() & SetActiveJSONMember()

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

CombineJSONMember() & SetActiveJSONMember()

Beitrag von GPI »

Ich brauchte eine Möglichkeit, um zwei JSON zu mischen.
Ziel war es in JSON1 quasi Default-Werte zu speichern und dann in JSON2 einzufügen mit den tatsächlichen Einstellungen.

CombineJSONMember(ObjectValue1,ObjectValue2)
Fügt alle Einträge aus ObjectValue2 in ObjectValue1 ein. Kein Rückgabewert

SetActiveJSONMember(ObjectValue,KeyName.s)
sucht in Object nach den MemberKey und gibt entweder den MemberValue oder 0 (für nicht gefunden) zurück.

Code: Alles auswählen

Declare CombineJSONMember(Value1,Value2)

  Procedure SetActiveJSONMember(ObjectValue,name.s)
    Protected ret
    If ExamineJSONMembers(ObjectValue)
      While NextJSONMember(ObjectValue)
        If JSONMemberKey(ObjectValue)=name
          ret=JSONMemberValue(ObjectValue)
          Break
        EndIf
      Wend
    EndIf
    ProcedureReturn ret
  EndProcedure
  Procedure _InsertArray(newva,jmv2)
    Protected count1,count,i,Element,NewElement
    count1=JSONArraySize(newva)
    count=JSONArraySize(jmv2)
    For i=0 To count-1
      Element=GetJSONElement(jmv2,i)
      If i<count1
        RemoveJSONElement(newva,i)
      EndIf
      NewElement=AddJSONElement(newva,i)
      Select JSONType(element)
        Case #PB_JSON_Null
          SetJSONNull(NewElement)
        Case #PB_JSON_String
          SetJSONString(NewElement,GetJSONString(Element))
        Case #PB_JSON_Number
          SetJSONDouble(NewElement,GetJSONDouble(Element))
        Case #PB_JSON_Boolean
          SetJSONBoolean(NewElement,GetJSONBoolean(Element))
        Case #PB_JSON_Array
          SetJSONArray(NewElement)
          _InsertArray(NewElement,Element)
        Case #PB_JSON_Object
          SetJSONObject(NewElement)
          CombineJSONMember(NewElement,Element)
      EndSelect
    Next     
  EndProcedure
  Procedure CombineJSONMember(Value1,Value2)
    Protected newva
    Protected jmv2
    Protected jmk2.s
    If ExamineJSONMembers(Value2)
      While NextJSONMember(Value2)
        
        jmv2=JSONMemberValue(Value2)
        jmk2.s=JSONMemberKey(Value2)
        
        Select JSONType(jmv2)
          Case #PB_JSON_Null
            newva=AddJSONMember(Value1,jmk2)
            SetJSONNull(newva)
          Case #PB_JSON_String
            newva=AddJSONMember(Value1,jmk2)
            SetJSONString(newva,GetJSONString(jmv2))
          Case #PB_JSON_Number
            newva=AddJSONMember(Value1,jmk2)
            SetJSONDouble(newva,GetJSONDouble(jmv2))
          Case #PB_JSON_Boolean
            newva=AddJSONMember(Value1,jmk2)
            SetJSONBoolean(newva,GetJSONBoolean(jmv2))
          Case #PB_JSON_Array            
            newva=SetActiveJSONMember(Value1,jmk2)
            If newva=0 Or JSONType(newva)<>#PB_JSON_Array
              newva=AddJSONMember(Value1,jmk2)
              SetJSONArray(newva)
            EndIf
            _InsertArray(newva,jmv2)
          Case #PB_JSON_Object
            newva=SetActiveJSONMember(Value1,jmk2)
            If newva=0 Or JSONType(newva)<>#PB_JSON_Object
              newva=AddJSONMember(Value1,jmk2)
              SetJSONObject(newva)
            EndIf
            CombineJSONMember(newva,jmv2)
        EndSelect
      Wend
    EndIf
  EndProcedure
Structure s1
  a.i
  b.i
EndStructure
Structure t1
  a.i
  v.s1
EndStructure

Structure s2
  a.i
  d.s
EndStructure

Structure t2
  a.i
  c.i
  d.i
  v.s2
  w.s2
  List str.s()
  Array List.s1(2)
EndStructure

j1=CreateJSON(#PB_Any)
j2=CreateJSON(#PB_Any)


v1.t1
v1\a=10
v1\v\a=20
v1\v\b=30

v2.t2
v2\a=40
v2\c=50
v2\d=60
v2\v\a=70
v2\v\d="String1"
v2\w\a=80
v2\w\d="String2"
AddElement(v2\Str()):v2\Str()="String3"
AddElement(v2\Str()):v2\Str()="String4"
AddElement(v2\Str()):v2\Str()="String5"
For i=0 To 2
  v2\List(i)\a=1000*i+100
  v2\List(i)\b=1000*i+110
Next


InsertJSONStructure(JSONValue(j1),@v1,t1)
InsertJSONStructure(JSONValue(j2),@v2,t2)

Debug "V1"
Debug ComposeJSON(j1)
Debug "v2"
Debug ComposeJSON(j2)




CombineJSONMember(JSONValue(j1),JSONValue(j2))
Debug "Combine in v1"
Debug ComposeJSON(j1)

                    
Edit: _Insert ersetzt jetzt nicht mehr Arrays, sondern combiniert sie.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!